hdu 4033 Reglar Polygon(二分)+++++
1823 ワード
<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
",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
",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
",l,mid);
else printf("Case %d: impossible
",l);
}
}