http://poj.org/problem?id=1905
题目大意:一根棍子夹在两堵墙之间,加热之后会膨胀。求膨胀之后棍子中点距离水平的高度。利用勾股定理,二分求解。已知半径和弧度,假定所求高度为 m,棍子长度为 l,勾股定理可知圆半径为 (m * m + l * l /4)/(2*m)。利用半径对应求出的弧长的比较来判断二分区间。
代码如下:
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std ;
int main()
{
double L ;
double S ;
double r ;
double n ;
double C ;
while(scanf("%lf%lf%lf" , &L , &n ,&C)!=EOF )
{
if(L < 0 && n < 0 && C < 0)
break ;
S = L * ( 1 + n * C) ;
double r1 ;
double r2 ;
r1 = 0.0 ;
r2 = L / 2 ;
double x ;
while(r2 - r1 > 1e-5)
{
x = (r1 + r2)/ 2 ;
r = L * L / ( 8 * x) + x / 2 ;
if(r*2*asin((L/2/r)) < S)
r1 = x ;
else
r2 = x ;
}
printf("%.3lf\n" , x ) ;
}
}