列舉 飛彈攔截

2022-04-04 22:30:43 字數 1435 閱讀 8636

經過11年的韜光養晦,某國研發出了一種新的飛彈攔截系統,凡是與它的距離不超過其工作半徑的飛彈都能夠被它成功攔截。當工作半徑為0時,則能夠攔截與它位置恰好相同的飛彈。但該飛彈攔截系統也存在這樣的缺陷:每套系統每天只能設定一次工作半徑。而當天的使用代價,就是所有系統工作半徑的平方和。

某天,雷達捕捉到敵國的飛彈來襲。由於該系統尚處於試驗階段,所以只有兩套系統投入工作。如果現在的要求是攔截所有的飛彈,請計算這一天的最小使用代價。

第一行包含4個整數x1、y1、x2、y2,每兩個整數之間用乙個空格隔開,表示這兩套飛彈攔截系統的座標分別為(x1,y1)、(x2,y2)。

第二行包含1個整數n(1≤n≤100000),表示有n顆飛彈。接下來n行,每行兩個整數x、y,中間用乙個空格隔開,表示一顆飛彈的座標(x,y)。不同飛彈的座標可能相同。

輸出只有一行,包含乙個整數,即當天的最小使用代價。

0 0 10 0

2-3 3

10 0

18

兩個點(x1,y1)、(x2,y2)之間距離的平方是(x1−x2)2+(y1−y2)2。

兩套系統工作半徑r1、r2的平方和,是指r1、r2分別取平方後再求和,即r12+r22。

對於100%的資料,1≤n≤100000,且所有座標分量的絕對值都不超過1000。

思路:一開始想用貪心的思想,對於乙個飛彈,如果它裡系統1近,就歸系統1管,否則就歸系統2管,發現這對一些情況不適用,所以是錯誤的,然後還想了很多貪心思想的其他方法,發現都不對...其實這裡只需要列舉系統1的半徑即可(當系統1的半徑確定下來了,系統2的半徑也可以相應確定)。列舉的範圍當然是d1[i](i=1...n)(d1[i]表示第i顆飛彈到系統1的距離),當系統1的半徑確定為d1[i]時,系統2的半徑就是d1[i]覆蓋不到的那些飛彈中距離系統2的最大距離。所以我們在列舉d1[i]之前先對d1陣列從大到小排序,那麼i之前的飛彈(1~i-1)就是d1[i]覆蓋不到的飛彈,此時系統2的半徑就是max(j:1~i-1)。

ac**:

#include #include

#include

#define ll long long

#define inf 0x3f3f3f3f

using

namespace

std;

inta,b,c,d;

struct

ss[100010

];bool

cmp1(s a,s b)

intmain()

sort(s+1,s+1+n,cmp1);

ll ans=inf,maxd2=0

;

for(int i=1;i<=n;i++)

ans=min(ans,maxd2);

printf(

"%lld\n

",ans);

return0;

}

飛彈攔截2

某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈。輸入飛彈依次飛來的高度 雷達給出...

飛彈攔截(貪心)

b b time limit 1000msmemory limit 32768kb64bit io format i64d i64u submit status practice hdu 1257 description 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統.但是這種飛彈攔截系統有乙個...

飛彈攔截2

某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈。輸入飛彈依次飛來的高度 雷達給出...