您的位置:首页 > 其它

poj 2420 A Star not a Tree?

2016-02-18 20:01 323 查看
简单三分。。先确定x,由x再寻找y,由y来选择x。。

[code]#include<stdio.h>
#include<math.h>
struct sb
{
   double x;
   double y;
}node[110];
int n;
double judgex(double x)
{
    double lefty=-0x3f3f3f3f;
    double righty=0x3f3f3f3f;
    double mid1;
    double mid2;
    double ans1;
    double ans2;
    int i;
    while(righty-lefty>1)
    {
        mid1=(righty-lefty)/3+lefty;
        mid2=righty-(righty-lefty)/3;
        ans1=0;
        ans2=0;
        for(i=1;i<=n;i++)
        {
            ans1=ans1+sqrt((node[i].x-x)*(node[i].x-x)+(node[i].y-mid1)*(node[i].y-mid1));
            ans2=ans2+sqrt((node[i].x-x)*(node[i].x-x)+(node[i].y-mid2)*(node[i].y-mid2));
        }
        if(ans2>ans1)
            righty=mid2;
        else
            lefty=mid1;
    }
    return ans1;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%lf%lf",&node[i].x,&node[i].y);
    double leftx=-0x3f3f3f3f;
    double rightx=0x3f3f3f3f;
    double mid1;
    double mid2;
    double test1;
    double test2;
    while(rightx-leftx>1)
    {
        mid1=(rightx-leftx)/3+leftx;
        mid2=rightx-(rightx-leftx)/3;
        test1=judgex(mid1);
        test2=judgex(mid2);
        if(test1>test2)
            leftx=mid1;
        else
            rightx=mid2;
    }
    printf("%.0lf\n",test1);
    return 0;
}


再来一个暴力的做法

[code]#include<stdio.h>
#include<math.h>
struct sb
{
   double x;
   double y;
}node[110];
int n;
double judgex(double x)
{
    double lefty=-0x3f3f3f3f;
    double righty=0x3f3f3f3f;
    double mid1;
    double mid2;
    double ans1;
    double ans2;
    int i;
    int z=150;
    while(z--)
    {
        mid1=(righty-lefty)/3+lefty;
        mid2=righty-(righty-lefty)/3;
        ans1=0;
        ans2=0;
        for(i=1;i<=n;i++)
        {
            ans1=ans1+sqrt((node[i].x-x)*(node[i].x-x)+(node[i].y-mid1)*(node[i].y-mid1));
            ans2=ans2+sqrt((node[i].x-x)*(node[i].x-x)+(node[i].y-mid2)*(node[i].y-mid2));
        }
        if(ans2>ans1)
            righty=mid2;
        else
            lefty=mid1;
    }
    return ans1;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%lf%lf",&node[i].x,&node[i].y);
    double leftx=-0x3f3f3f3f;
    double rightx=0x3f3f3f3f;
    double mid1;
    double mid2;
    double test1;
    double test2;
    int z=150;
    while(z--)
    {
        mid1=(rightx-leftx)/3+leftx;
        mid2=rightx-(rightx-leftx)/3;
        test1=judgex(mid1);
        test2=judgex(mid2);
        if(test1>test2)
            leftx=mid1;
        else
            rightx=mid2;
    }
    printf("%.0lf\n",test1);
    return 0;
}


前一个16ms 后一个120+。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: