hdu-4724-How Long Do You Have to Draw-贪心

来源:互联网 发布:淘宝怎么买百度云账号 编辑:程序博客网 时间:2024/05/21 10:30

题目看起来很难,其实很简单。。。。

根据题意可知,如果想连到最多的三角形,肯定是每个点都要跟其他的点相连。

然后就贪心当前连接情况下,哪一种连接方式用掉的线段最短,然后算出总和即可。

#include<stdio.h>#include<string.h>#include<stdlib.h>#include<iostream>#include<algorithm>#include<vector>#include<queue>#include<map>#include<math.h>using namespace std;#define maxn 110000#define INF 99999999double c[maxn];double d[maxn];double a,b;int main(){    int T,cas,n,m;    cas=0;    scanf("%d",&T);    while(T--)    {        cas++;        scanf("%lf%lf",&a,&b);        scanf("%d%d",&n,&m);        for(int i=1;i<=n;i++)scanf("%lf",&c[i]);        for(int i=1;i<=m;i++)scanf("%lf",&d[i]);        double ans=0.0;        int stx,sty;        stx=sty=1;        double st=(a-b)*(a-b);        ans+=sqrt((c[1]-d[1])*(c[1]-d[1])+st);        while(1)        {            double x,y;            x=y=1000000000.0;            int leap=0;            if(stx<n)            {                x=sqrt((c[stx+1]-d[sty])*(c[stx+1]-d[sty])+st);                leap=1;            }            if(sty<m)            {                y=sqrt((c[stx]-d[sty+1])*(c[stx]-d[sty+1])+st);                leap=1;            }            if(!leap)break;            if(x<y)            {                stx++;                ans+=x;            }            else            {                sty++;                ans+=y;            }        }        printf("Case #%d: %.2f\n",cas,ans);    }    return 0;}


0 0
原创粉丝点击