1. 程式人生 > >POJ 1905(集訓比賽2B_A題)解題報告

POJ 1905(集訓比賽2B_A題)解題報告

div oid 數學 nbsp log const 部分 hide 二分

題目鏈接:http://poj.org/problem?id=1905

---------------------------------------------------------

題意:一個線段,給出長度、加熱溫度及熱膨脹系數,線段加熱後變為圓弧的一部分,要求求弧頂長度為多少。

思路:簡單的畫一下圖,發現幾何關系還是比較明確的,但是發現x的數學表達式並不容易解出來,所以采用二分法求值的方法。選擇二分的對象很重要,直接選擇對要求的x進行二分,避免角度誤差太大。

代碼:

技術分享圖片
#include <cstdio>
#include <cmath>
double L =0;
double
n=0; double C=0; const double PI =acos(-1.0); const double eps=1e-8; int jud(double mid){ if((2*asin((0.5*L)/((L*L+4*mid*mid)/(8*mid)))*(L*L+4*mid*mid)/(8*mid))>=(1+n*C)*L) return 0; else return 1; } double proce(){ double left =0; double right=L/2; double mid; while(right-left>eps){ mid
= (left+right)/2; if (jud(mid)){ left = mid; }else{ right =mid; } } return mid; } int main(void){ while(~scanf("%lf %lf %lf",&L,&n,&C)){ if(L==-1&&n==-1&C==-1) break; else{ double h = proce(); printf(
"%.3f\n",h); } } return 0; }
View Code

POJ 1905(集訓比賽2B_A題)解題報告