做这个题做到怀疑智商了QAQ
分析:
由题意已知:L ,s ,0<h<L/2 ; 求 h;
那么知道S(R(h))的单调性就可以知道用二分还是三分求解了;
下面是错误分析(这段分析真的还以自己还有没有智商了)
根据 h 的范围;我对①式中的 h 求导;得出 r 随 h 的增大而减小(即单调减函数);然后我一看②式妥妥的单调增函数啊;然后我就判定这个复合函数为单调减函数了。
但是我突然发现我运行样例的时候,???,怎么都不对,我就去翻别人的题解,从别人的代码里我发现一个问题,就是这个复合函数是单调增的,然后我质疑了自己的思路,没问题啊,又求了很多次导;终于发现woc,那个式子②他不是单增啊,然后又发现,我不会求这个函数;
所以正确的分析应该是这样的:
h 增加,那个弧长一定是增加的啊,也就是我那个复合函数是单增的。woc我在想什么????想求导想疯了;
但翻别人写的题解的时候,我还是有收获的:
就是二分的时候精度问题:还可以通过直接二分100次解决,但是感觉不靠谱,我三分用了100,直接TLE了,别人的二分100次;但是吧现在还没遇到卡精度卡那么高的题,等以后吃亏了再来写写这个while(100);
#include <iostream>
#include <cmath>
using namespace std;
double L,n,c;
double f(double h){
double r=(4*h*h+L*L)/(8*h);
return 2*r*asin(L/(2*r));
}
double Bifi(double l,double r,double s){
while(r-l>1e-6){
double mid=(r+l)/2;
if( s>f(mid) )l=mid;
else r=mid;
}
return (r+l)/2;
}
int main(){
while(scanf("%lf%lf%lf",&L,&n,&c)){
if(L<0&&n<0&&c<0)break;
double s=(1+n*c)*L;
printf("%.3f\n",Bifi(0.0,L/2,s));
}
return 0;
}