codeforces 617C

来源:互联网 发布:oppo商城软件下载 编辑:程序博客网 时间:2024/05/21 05:41

两个喷泉,n 个花朵 

要使得所有花朵被覆盖,并使得 R1*R1 +R2*R2 

枚举 每一个点到p1的距离,对于不在R1 之内的点,计算其到R2的距离,并记录最大值, 特殊考虑p1 || p2 覆盖所有点的情况 

#include<bits/stdc++.h>using namespace std;struct node{    __int64 x,y;} a[2010];node p1,p2;__int64 dis(node c,node d){    return (c.x-d.x)*(c.x-d.x)+(c.y - d.y)*(c.y- d.y);}int main(){    int n;    scanf("%d",&n);    scanf("%I64d%I64d%I64d%I64d",&p1.x,&p1.y,&p2.x,&p2.y);    for(int i = 1; i<=n; i++)    {        scanf("%I64d%I64d",&a[i].x,&a[i].y);    }    if(n==1)    {        printf("%I64d\n",min(dis(p1,a[1]),dis(p2,a[1])));        return 0;    }    __int64  ans = 10000000000000000;    for(int i = 1; i<=n; i++)    {        __int64 q1  = dis(p1,a[i]);        __int64 ans2 = 0;        for(int j = 1; j<=n; j++)        {            if(j==i)                continue;            __int64  q2= dis(a[j],p1);            if(q2>q1)            {                if(ans2<dis(p2,a[j]))                {                    ans2 = dis(p2,a[j]);                }            }        }        if(ans>ans2+q1)        {            ans =ans2+q1;        }    }    __int64 c = 0;    __int64 d= 0;    for(int i= 1; i<=n; i++)    {        c = max(c,dis(a[i],p1));        d = max(d,dis(a[i],p2));    }    __int64  f = min(c,d);    printf("%I64d\n",min(f,ans));    return 0;}


0 0
原创粉丝点击