NOIP2010T3 导弹拦截

 

#include<cstdio>
#include<algorithm>
using namespace std;
struct distance{ //导弹到两个系统的距离
    int a, b;
    bool operator <(const distance u) const {return a>u.a;}
}dis[1000010];
int main(){
    int x1,x2,y1,y2,x,y,s,t,n;
    scanf("%d%d%d%d",&x1,&y1,&x2,&y2);//两个系统的坐标
    scanf("%d",&n);//导弹数
    for(int i=0;i<n;i++){
        scanf("%d%d",&x,&y);
        dis[i].a=(x-x1)*(x-x1)+(y-y1)*(y-y1);
        dis[i].b=(x-x2)*(x-x2)+(y-y2)*(y-y2);
    }
    sort(dis,dis+n);//直接快排
    s=dis[0].a;t=0;
    for(int i=0;i<n;i++){
        s=min(s,dis[i].a+t);
        t=max(t,dis[i].b);
    }
    printf("%d\n",s);
    return 0;
}

  

 

 

var x1,y1,x2,y2,x,y,i,s,t,n:longint;
    distA,distB:array[1..100010] of longint;
procedure Qsort(l,r:longint);
var i,j,x,temp:longint;
begin
    i:=l; j:=r;
    x:=distA[(l+r) div 2];
    repeat
        while distA[i]>x do inc(i);
        while x>distA[j] do dec(j);
        if i<=j then
        begin
            temp:=distA[i]; distA[i]:=distA[j]; distA[j]:=temp;
            temp:=distB[i]; distB[i]:=distB[j]; distB[j]:=temp;
            inc(i); dec(j);
        end;
    until i>j;
    if i<r then Qsort(i,r);
    if l<j then Qsort(l,j);
end;

function min(a,b:longint):longint;
begin
    if a<b then min:=a else min:=b;
end;

function max(a,b:longint):longint;
begin
    if a>b then max:=a else max:=b;
end;

begin
    assign(input,'missile2.in'); reset(input);
    assign(output,'missile2.out'); rewrite(output);
    readln(x1,y1,x2,y2);
    readln(n);
    for i:=1 to n do
    begin
        readln(x,y);
        distA[i]:=sqr(x-x1)+sqr(y-y1);
        distB[i]:=sqr(x-x2)+sqr(y-y2);
    end;

    Qsort(1,n);
    s:=distA[1];
    t:=0;
    for i:=1 to n do
    begin
        s:=min(s,distA[i]+t);
        t:=max(t,distB[i]);
    end;
    writeln(s);
    close(input); close(output);
end.

 

 

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
struct distance{ //导弹到两个系统的距离
    int a, b;
    bool operator <(const distance u) const {return a>u.a;}
}dis[1000010];
int main(){
    int x1,x2,y1,y2,x,y,s,t,n;
    scanf("%d%d%d%d",&x1,&y1,&x2,&y2);//两个系统的坐标
    scanf("%d",&n);//导弹数
    for(int i=0;i<n;i++){
        scanf("%d%d",&x,&y);
        dis[i].a=(x-x1)*(x-x1)+(y-y1)*(y-y1);
        dis[i].b=(x-x2)*(x-x2)+(y-y2)*(y-y2);
    }
    sort(dis,dis+n);//直接快排
    s=dis[0].a;t=0;
    for(int i=0;i<n;i++){
        s=min(s,dis[i].a+t);
        t=max(t,dis[i].b);
    }
    printf("%d\n",s);
    return 0;
}

 

 

 

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;
const int N = 100000 + 10;
struct daodan {
    int a, b;
    bool operator <(const daodan u) const {
        return a > u.a;
    }
} e[N];
int n, x[3], y[3], s, t;
inline int sqr(int x) {
    return x * x;
}
int main() {
    freopen("missile.in", "r", stdin);
    freopen("missile.out", "w", stdout);
    scanf("%d %d", x+1, y+1);
    scanf("%d %d", x+2, y+2);
    scanf("%d", &n);
    for(int i=0; i<n; i++) {
        scanf("%d %d", x, y);
        e[i].a = sqr(x[0] - x[1]) + sqr(y[0] - y[1]);
        e[i].b = sqr(x[0] - x[2]) + sqr(y[0] - y[2]);
    } sort(e, e+n);
    s = e[0].a;
    for(int i=0; i<n; i++) {
        s = min(s, e[i].a + t);
        t = max(t, e[i].b);
    } printf("%d\n", s);
    return 0;
}

 

posted @ 2013-10-25 14:59  qilinart  阅读(365)  评论(0编辑  收藏  举报