题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4033
这个题目开始没想起来,后来经队友提醒 wa的若干次AC
这个题目还是要理解角度枚举边长
找到所有三角形给定的两边所有两边之和最小的为上界,两边之差最大的为下界,开始枚举
枚举看计算出来所有顶角的和,比2PI大,说明边长大了,否则边长小了,找到符合的输出!
精度下面的程序很奇怪 1e-6 1e-7 1e-8 1e-9 1e-11都不行,只有1e-10才行,不解!
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <cmath>
using namespace std;
#define maxn 200
#define eps 1e-10
const double PI=acos(-1.0);
double po[maxn];
int n;
double MMax,MMin;
int find_ans(double l,double r)
{
double mid,ang;
int i,j,k;
while(l<=r)
{
mid=(l+r)/2.0;
ang=0;
for(i=0;i<n;i++)
ang+=acos((po[i]*po[i]+po[i+1]*po[i+1]-mid*mid)/(2.0*po[i]*po[i+1]));
if(fabs(ang-PI*2.0) <= eps)
{
printf("%.3lf\n",mid);
return 0;
}
if(ang > PI*2.0+eps)
r=mid-eps;
else
l=mid+eps;
}
printf("impossible\n");
return 0;
}
int main()
{
int i,j,k=0,t;
scanf("%d",&t);
while(t--)
{
printf("Case %d: ",++k);
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%lf",&po[i]);
po[n]=po[0];
MMin=-1,MMax=10000000;
for(i=0;i<n;i++)
{
if(fabs(po[i]-po[i+1]) > MMin)
MMin=fabs(po[i]-po[i+1]);
if(po[i]+po[i+1] < MMax)
MMax=po[i]+po[i+1];
}
if(MMax <= MMin)
{
printf("impossible\n");
continue;
}
find_ans(MMin,MMax);
}
return 0;
}