【题目描述】
【题目链接】
http://noi.openjudge.cn/ch0111/09/
【算法】
奇怪的二分。。。可以列出关系式:LL = L * θ / sin(θ),众所周知X>=sin(X)根据图像显然X/sin(X)递增。所以可以视为LL=L*F(θ),又θ从0~π/2,所以当弦长一定时,角度越大,弧长越大,若弧长超过LL则修改右端点为mid反之修改左端点为mid。另实数域上的二分需设置精度或者用for循环定一个二分次数。同时,若θ过小,借助三角关系计算h会炸,所以一开始就判断若木棍增长小于设置的精度,直接输出0.000.
【代码】
1 #include <bits/stdc++.h> 2 #define esp 1e-11 3 using namespace std; 4 double L,n,C,LL; 5 int main() 6 { 7 scanf("%lf%lf%lf",&L,&n,&C); 8 if(n*C<=esp) { printf("0.000\n"); return 0; } 9 LL=(1+n*C)*L; 10 double l=0,r=M_PI/2; 11 while(r-l>esp) { 12 double mid=(l+r)/2; 13 if(mid/sin(mid)*L>LL) r=mid; 14 else l=mid; 15 } 16 printf("%.3lf\n",L*(1-cos(l))/2/sin(l)); 17 return 0; 18 }