http://poj.org/problem?id=1905
题目:有一条金属条,长度为l,受热会膨胀变长,但两边固定,所以就变弯了。。。给出加热的度n,膨胀系数c,受热后长度为(1+n*c)*L,题目保证弯曲后可以构成圆,变长不会超过原来的一半。问金属片中间升高了多高。
思路:开始的思路就是二分,发现在二分中找不到接下来往下分的规律,看其他题解也觉得得出的一个函数是对勾函数,二分应该也是线性啊。。。之后发现由于一开始L固定的话,高度和弧的长度是正相关,所以二分枚举高度就可以了,神想法啊。。。
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
double dg,c,L,s;
void getAns(double l, double r){
if (r - l < 0.0001){
cout<<fixed<<setprecision(3) << l << endl;
return ;
}
double mid = (l+r)/2;
double R = (4*mid*mid + L*L )/ (8*mid);
double _s = 2*R*asin(L/(2*R));
if (_s < s) return getAns(mid,r);
else getAns(l,mid);
}
int main(){
while(cin >> L >> dg >> c && L != -1){
s = (1+c*dg)*L;
//smax = (1 << 31)-1;
getAns(0, (double)L/2);
}
}