hdu 4033 Regular Polygon (二分)++++++
<a href="http://acm.hdu.edu.cn/showproblem.php?pid=4033">http://acm.hdu.edu.cn/showproblem.php?pid=4033</a> 思路:二分 先找 两边之和的最小max 和两边只差的最大 min 则边的长度 L 必然 min<l<max 然后二分求解 注意啊,一开始定义 eps 是为e-6,wa 改为e-8 ac #include<stdio.h> #define N 1000 #include<math.h> #define eps 1e-8 const double pi=2*acos(-1); double a[N]; int main() { int T,l,i,n; scanf("%d",&T); for(l=1;l<=T;l++) { scanf("%d",&n); for(i=1;i<=n;i++) scanf("%lf",&a[i]); a[n+1]=a[1]; double min=-1,max=9999999; for(i=1;i<=n;i++) { double temp=a[i]+a[i+1]; if(max>temp)max=temp; temp=fabs(a[i]-a[i+1]); if(min<temp)min=temp; //printf("%lf %lf 12122\n",min,max); } int f=0; double mid; while(max-min>eps) { mid=(min+max)/2; double sum=0; for(i=1;i<=n;i++) { sum+=acos((a[i]*a[i]+a[i+1]*a[i+1]-mid*mid)/(2*a[i]*a[i+1])); } //printf("%lf %lf\n",sum,pi); if(fabs(pi-sum)<=eps) { f=1; break; } else if(sum-pi>eps) { max=mid; } else if(pi-sum>eps) { min=mid; } } if(f)printf("Case %d: %.3lf\n",l,mid); else printf("Case %d: impossible\n",l); } }