HDU 4723 How Long Do You Have to Draw

题目链接: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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值