膨胀的木棍 (二分)

【题目描述】

    

【题目链接】

    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 }

猜你喜欢

转载自www.cnblogs.com/Willendless/p/9363639.html