标签:
/* 题目大体意思是两套系统好多导弹 怎样分配使得两个系统所拦截的最大半径之和最小 贪心:把距离1系统最远的 让2拦截 记好距离 然后按照距离1由远到近排序 对于每一个导弹 如果这之前的都给2拦截 则1的半径就是ri 2的半径则是前面所有的的max ans就是两者之和 我们O(n)的跑一边 边跑边维护min就好了 */ #include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #define maxn 100010 using namespace std; int n,s; struct node { int ss1; int ss2; }; node aa[maxn]; int x11,y11,x22,y22; int jisuan(int x1,int y1,int x2,int y2) { return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2); } int cmp(const node &x,const node &y) { if(x.ss1>y.ss1)return 1; return 0; } int main() { int i; int a,b; cin>>x11>>y11>>x22>>y22>>n; for(i=1;i<=n;i++) { cin>>a>>b; int s1=jisuan(a,b,x11,y11); int s2=jisuan(a,b,x22,y22); aa[i].ss1=s1; aa[i].ss2=s2; } sort(aa+1,aa+1+n,cmp); int tot=999999999,mm=0; for(i=1;i<=n;i++) { tot=min(tot,aa[i].ss1+mm); mm=max(mm,aa[i].ss2); } cout<<tot; }
标签:
原文地址:http://www.cnblogs.com/yanlifneg/p/5551241.html