POJ 1905 二分

题意:

一根细杆长为l,能够压弯成为一段长为(1+n*c)*l 的圆弧。给出l, n, c的值,求出杆变形后,中间升高的距离h

 

题解:

二分圆心到细杆的距离,然后算出弧长,判断当前二分值的大小是否合适即可

 

View Code
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 #include <algorithm>
 6 #include <cmath>
 7 
 8 #define PI 3.141592653589793
 9 #define EPS 1e-7
10 
11 using namespace std;
12 
13 double n,l,c,sl;
14 
15 inline int doublecmp(double x)
16 {
17     if(x>EPS) return 1;
18     else if(x<-EPS) return -1;
19     return 0;
20 }
21 
22 inline double getlen(double a,double b)
23 {
24     return sqrt(a*a+b*b);
25 }
26 
27 inline void go()
28 {
29     sl=(1+n*c)*l;
30     double lt=0.0,rt=1000000000.0,mid,af,hc;
31     int cs=500;
32     while(cs--)
33     {
34         mid=(lt+rt)*0.5;
35         af=atan2(l*0.5,mid);
36         af*=2.0;
37         hc=af*getlen(mid,l*0.5);
38         if(doublecmp(hc-sl)>0) lt=mid;
39         else rt=mid;
40     }
41     printf("%.3lf\n",getlen(mid,l*0.5)-mid);
42 }
43 
44 int main()
45 {
46     while(scanf("%lf%lf%lf",&l,&n,&c))
47     {
48         if(l==-1.0&&n==-1.0&&c==-1.0) break;
49         if(doublecmp(l)==0||doublecmp(n)==0||doublecmp(c)==0) puts("0.000");
50         else go();
51     }
52     return 0;
53 }

 

 

posted @ 2013-02-24 20:06  proverbs  阅读(202)  评论(0编辑  收藏  举报