codevs 1128 導彈攔截
阿新 • • 發佈:2017-05-19
每次 return 存在 一個 sample -- 由於 all 一次
題目描述 Description
輸入描述 Input Description
經過11 年的韜光養晦,某國研發出了一種新的導彈攔截系統,凡是與它的距離不超過其工作半徑的導彈都能夠被它成功攔截。當工作半徑為0 時,則能夠攔截與它位置恰好相同的導彈。但該導彈攔截系統也存在這樣的缺陷:每套系統每天只能設定一次工作半徑。而當天的使用代價,就是所有系統工作半徑的平方和。
某天,雷達捕捉到敵國的導彈來襲。由於該系統尚處於試驗階段,所以只有兩套系統投入工作。如果現在的要求是攔截所有的導彈,請計算這一天的最小使用代價。
數據範圍
對於10%的數據,N = 1
對於20%的數據,1 ≤ N ≤ 2
對於40%的數據,1 ≤ N ≤ 100
對於70%的數據,1 ≤ N ≤ 1000
對於100%的數據,1 ≤ N ≤ 100000,且所有坐標分量的絕對值都不超過1000。
第一行包含4 個整數x1、y1、x2、y2,每兩個整數之間用一個空格隔開,表示這兩套導彈攔截系統的坐標分別為(x1, y1)、(x2, y2)。
第二行包含1 個整數N,表示有N 顆導彈。接下來N 行,每行兩個整數x、y,中間用一個空格隔開,表示一顆導彈的坐標(x, y)。不同導彈的坐標可能相同。
輸出只有一行,包含一個整數,即當天的最小使用代價。
樣例輸入 Sample Input0 0 10 0
2
-3 3
10 0
18
數據範圍及提示 Data Size & Hint兩個點(x1, y1)、(x2, y2)之間距離的平方是(x1? x2)^2+(y1?y2)^2。
兩套系統工作半徑r1、r2 的平方和,是指r1、r2 分別取平方後再求和,即r1^2+r2^2。
分析:
貪心。。。
記錄每個攔截器到每個點的距離,將list1其中一個排序。
每次n減一,並順便更新list2前n+1號的最大距離。
#include<iostream> #include<algorithm> #include<cmath> using namespace std; const int inf=9999999; struct node{int sum; int num; }list1[100010]; int list2[100010]; int dis(int x,int y,int x2,int y2) { return (x-x2)*(x-x2)+(y-y2)*(y-y2); } bool cmp(const node &a,const node &b) { return a.sum<b.sum; } int main() { int x1,y1,x2,y2,n; cin>>x1>>y1>>x2>>y2; cin>>n; for(int i=1;i<=n;++i) { int x,y; cin>>x>>y; int dis1=dis(x,y,x1,y1),dis2=dis(x,y,x2,y2); list1[i].num=i; list1[i].sum=dis1; list2[i]=dis2; } sort(list1+1,list1+n+1,cmp); int ans=inf,k=-1; while(n) { ans=min(ans,list1[n].sum+(k=max(k,list2[list1[n+1].num]))); n--; } cout<<ans; return 0; }
codevs 1128 導彈攔截