题目链接: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;
}
本文详细解析HDU 4033题的解题思路,即通过理解角度枚举边长来寻找满足条件的三角形。首先明确边界条件,即两边之和最小为上界,两边之差最大为下界。接着采用二分查找算法在边界内寻找符合条件的顶角。特别注意精度问题,发现1e-6到1e-9都可能WA,只有1e-10才通过。最后给出程序实现细节,包括变量定义、输入输出格式等。
&spm=1001.2101.3001.5002&articleId=10208237&d=1&t=3&u=755098e660cc4a41bffc906c70eb53f3)
174

被折叠的 条评论
为什么被折叠?



