您的位置:首页 > 其它

HDU 4723 How Long Do You Have to Draw

2013-09-12 18:40 411 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4723

这个题目要求的是最多的三角形,其实只要所有点都连了基本上就是最大了,我们要考虑的主要是最小

想想要想最大的话每个点都一定会连,而且一定是从左向右,因为不能相交嘛,那么就想办法使总长度最小

首先毫无疑问的是第一个点一定与第一个点相连,然后看程序中的while循环,下面的步骤要么是x++,要

么是y++,那么就根据下一步的链接情况来判断,要没是x与y+1连接,要么是x+1,与y连接,两种情况

选择最优,最后考虑结束的特殊情况!

#include <stdio.h>
#include <cmath>
#define maxn 100010
double a[maxn],b[maxn],up,down,ans,g;
int n,m,x,y;
int main(){
int i,j,k,t,cas=0;
scanf("%d",&t);
while(t--){
ans=0;
scanf("%lf%lf",&up,&down);
g=(up-down)*(up-down);
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
scanf("%lf",&a[i]);
for(i=0;i<m;i++)
scanf("%lf",&b[i]);
x=0,y=0;
while(x<n && y < m){
ans+=sqrt(g+(a[x]-b[y])*(a[x]-b[y]));
if(x==n-1) y++;
else if(y==m-1) x++;
else{
if(fabs(a[x]-b[y+1]) < fabs(b[y]-a[x+1]))
y++;
else x++;
}
}
printf("Case #%d: %.2lf\n",++cas,ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  HDU