POJ 1905 Expanding Rods (二分+计算几何)

题意:一根木棒恰被夹在两堵墙中间,受热这跟木棒会膨胀,求膨胀后木棒偏离原位置的最远距离。

分析:木棒由于两段被卡住,膨胀后为圆弧的一段(圆的张力最大),就是求弦到弧的距离了。

这题有三个未知量:圆半径,弧的角度,还有最后要求的答案。这三个未知量知道一个就可以求出另外两个,所以此题有三种解法,即对三个未知量分别二分。

另外注意c++和G++对double的输出不同。交错了就wa。。。

//Memory: 152 KB		
//Time: 0 MS
#include <stdio.h>
#include <math.h>
#define pi 3.1415926535897
#define ep 1E-8
int main()
{
	double r,l,ll,n,c;
	while(~scanf("%lf%lf%lf",&l,&n,&c))
	{
		if(l+1<ep && n+1<ep && c+1<ep)
			break;
		double high,low,mid,temp;
		high=l/2;
		low=0;
		ll=(1+n*c)*l;
		if(l==0 || n==0 || c==0)
			printf("0.000\n");
		else
		{
			while(fabs(high-low)>ep)  //二分答案
			{
				mid=(high+low)/2;
				r=((l/2)*(l/2)+mid*mid)/(2*mid);
				temp=r*2*asin(l/(2*r));
				if(fabs(ll-temp)<ep)
					break;
				else if(ll>temp)
					low=mid;
				else if(ll<temp)
					high=mid;
			}
			printf("%.3lf\n",mid);
		}
	}
	return 0;
}

你可能感兴趣的:(POJ 1905 Expanding Rods (二分+计算几何))