http://acm.hdu.edu.cn/showproblem.php?pid=4033
思路:二分
先找 两边之和的最小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);
}
}