2 3 3.0 4.0 5.0 3 1.0 2.0 3.0
Case 1: 6.766 Case 2: impossible
可以直接二分那个边长,然后通过计算内角和是否大于360来判断当前的边长是否合理
我的代码:
#include<stdio.h> #include<math.h> #include<algorithm> #define PI acos(-1.0) #define eps 1e-8 using namespace std; double a[105]; int n; double cal(double x) { int i; double sita=0,tmp1,tmp2; for(i=1;i<=n;i++) { tmp1=a[i]*a[i]+a[i+1]*a[i+1]-x*x; tmp2=2*a[i]*a[i+1]; sita=sita+acos(tmp1/tmp2); } return sita; } double solve(double left,double right) { int k; double mid; for(k=1;k<=200;k++) { mid=(left+right)/2; if(cal(mid)>2*PI+eps) { right=mid; } else { left=mid; } } return left; } double max(double a,double b) { if(a>b) return a; else return b; } double min(double a,double b) { if(a>b) return b; else return a; } int main() { int i,t,T; double ans,left,right; scanf("%d",&T); for(t=1;t<=T;t++) { left=0,right=99999; scanf("%d",&n); for(i=1;i<=n;i++) scanf("%lf",&a[i]); a[n+1]=a[1]; for(i=1;i<=n;i++) { right=min(right,a[i]+a[i+1]); left=max(left,fabs(a[i]-a[i+1])); } right=right-eps; if(left>right) { printf("Case %d: impossible\n",t); continue; } ans=solve(left,right); if(fabs(cal(ans)-2*PI)<eps) printf("Case %d: %.3lf\n",t,ans); else printf("Case %d: impossible\n",t); } return 0; }