首页 > 代码库 > HDU 4033

HDU 4033

 1 /*
 2 http://acm.hdu.edu.cn/showproblem.php?pid=4033
 3 题意:正n边形里面有一个点,知道这个点到n个顶点的距离,要求这个正多边形的边长
 4 思路:在(0,20000)二分查找答案,用上余弦定理
 5 2017年02月26日19:38:14
 6 */
 7 #include <cstdio>
 8 #include <cmath>
 9 double len[110];
10 int n;
11 double pi=acos(-1.0)*2;
12 double ef(double l,double r){
13     if(r-l<1e-6)return -1;
14     double m=(l+r)/2;
15     double du=0;
16     for(int i=0;i<n;i++){
17         if(m>len[i]+len[(i+1)%n])return ef(l,m);
18         du+=acos((-m*m+len[i]*len[i]+len[(i+1)%n]*len[(i+1)%n])/(2.0*len[i]*len[(i+1)%n]));
19     }
20     if(du>pi){
21         if(m-l<1e-6 && du-pi<1e-5 && pi-du<1e-5)return l;
22         return ef(l,m);
23     }else{
24         if(r-m<1e-6 && du-pi<1e-5 && pi-du<1e-5)return l;
25         return ef(m,r);
26     }
27 }
28 int main(){
29     int t;
30     scanf("%d",&t);
31     for(int tt=1;tt<=t;tt++){
32         scanf("%d",&n);
33         for(int i=0;i<n;i++){
34             scanf("%lf",&len[i]);
35         }
36         double res=ef(0,20000);
37         printf("Case %d: ",tt);
38         if(res<0){
39             printf("impossible\n");
40         }else{
41             printf("%.3f\n",res);
42         }
43     }
44     return 0;
45 }

 

HDU 4033