導彈攔截(noip2010普及)


 

洛谷

如果用一套系統就攔截了所有導彈,那么這套系統的半徑一定是最遠的那個

先算出每個導彈距系統的距離,用某結構體存

設按距系統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攔截的最大半徑之和小於之前的答案

那就更新嘍

顯然它合法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM