【二分查找】[Openjudge noi 1.11 09]膨胀的木棍
题目描述:
当长度为L的一根细木棍的温度升高n度,它会膨胀到新的长度
当一根细木棍被嵌在两堵墙之间被加热,它将膨胀形成弓形的弧,而这个弓形的弦恰好是未加热前木棍的原始位置。
你的任务是计算木棍中心的偏移距离。
题目分析:
首先可以发现我们需要二分的内容是当前角度,那么角度的范围可以很容易发现,因为木管长度不超过1.5倍那么就定角度为0-
if(Temp * ks * Len1 <= eps)
判断一下如果满足那么直接就输出0.000,
其他的情况我们可以发现如果我们枚举的是
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const double PI = asin(1.0);
const double eps = 1e-14;
int main(){
double Len1, Len2, Temp, ks;
while(scanf("%lf%lf%lf", &Len1, &Temp, &ks) != EOF){
Len2 = (1.0 + Temp * ks) * Len1;
double l=0, r=PI;
if(Temp * ks * Len1 <= eps){
printf("%.3lf\n", 0.0);
continue;
}
while(l < r - eps){
double mid = (l + r)/2.0;
if(Len1/sin(mid)*PI*(mid/PI) >= Len2)
r = mid;
else l = mid;
}
printf("%.3lf\n", Len1/2/sin(l)-Len1/2/sin(l)*cos(l));
}
return 0;
}