题意:就是给你一个正多边形内的点到正多边形的顶点的距离,求出这个正多边形的边长。
成都网络赛题目,wa了一个下午,一直以为是精度问题,看完标程才知道不是,是题目的问题,如果按标程的解法就是直接二分枚举,判断角度之和等于2pi吗?这样做明显是错的,反例菱形,我就是考虑了这一点,结果wa 了一个下午,我的做法,判断每个顶角是否相等,结果就wa了。刚刚顺着解题报告写了,1y。坑爹啊。
Run ID | Submit Time | Judge Status | Pro.ID | Exe.Time | Exe.Memory | Code Len. | Language | Author |
4584550 | 2011-09-11 22:00:53 | Accepted | 4033 | 15MS | 280K | 1051 B | G++ | xym2010 |
#include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<iostream> #include<cmath> using namespace std; const double PI=acos(0.0)*2; int n; double b[105]; double angle(double a,double b,double c) { return acos((a*a+b*b-c*c)/2/a/b); } int OK(double mid) { double ans=0; for(int i=0;i<n;i++) { if(b[i]+b[(i+1)%n]<=mid) return -1; if(fabs(b[i]-b[(i+1)%n])>=mid) return 0; ans+=angle(b[i],b[(i+1)%n],mid); } if(fabs(ans-2*PI)<0.000001)return 1; else if(ans-2*PI>0)return -1; else return 0; } int main() { int T,t,flag; scanf("%d",&T); for( t=1;t<=T;t++) { flag=0; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%lf",&b[i]); } double r=20000,l=0,mid; printf("Case %d: ",t); while(r-l>0.000001) { mid=(l+r)/2; int kk=OK(mid); if(kk==1) { printf("%.3f\n",mid); flag=1; break; } else if(kk==0) l=mid; else r=mid; } if(flag==0)printf("impossible\n"); } return 0; }