如果用一套系統就攔截了所有導彈,那么這套系統的半徑一定是最遠的那個
先算出每個導彈距系統的距離,用某結構體存
設按距系統1的距離從大到小排
這時系統1攔截半徑為最大的那個數,並且這時攔截了所有導彈
#include<bits/stdc++.h> using namespace std; int main() { int i; long long x, y; long long x1, y1, x2, y2, n; long long r=0, ans=0x7f7f7f7f; pair<long long, long long>dis[123456]; cin >> x1 >> y1 >> x2 >> y2 >> n; for (i=1;i<=n;i++) { cin >> x >> y; dis[i].first = (x - x1) * (x - x1) + (y - y1) * (y - y1); dis[i].second = (x - x2) * (x - x2) + (y - y2) * (y - y2); } sort(dis+1,dis+n+1); /*for(i=1;i<=n;++i) { printf("%d ",dis[i].first); printf("%d \n",dis[i].second); } */ while (n) { ans = min(ans, dis[n].first + (r = max(r, dis[n + 1].second))); n--; //printf("%d\n",ans); } cout << ans << endl; return 0; }
然后從大到小歷遍導彈
這時候就有一個反悔機制
如果發現系統1的最大半徑設為當前歷遍到的元素加上之前歷遍的用系統2攔截的最大半徑之和小於之前的答案
那就更新嘍
顯然它合法