noip2010 飛彈攔截 (貪心)

2021-07-05 10:53:24 字數 1735 閱讀 5974

p1810飛彈攔截

accepted

標籤:noip普及組2010

經過11 年的韜光養晦,某國研發出了一種新的飛彈攔截系統,凡是與它的距離不超過其工作半徑的飛彈都能夠被它成功攔截。當工作半徑為0 時,則能夠攔截與它位置恰好相同的飛彈。但該飛彈攔截系統也存在這樣的缺陷:每套系統每天只能設定一次工作半徑。而當天的使用代價,就是所有系統工作半徑的平方和。 某天,雷達捕捉到敵國的飛彈來襲。由於該系統尚處於試驗階段,所以只有兩套系統投入工作。如果現在的要求是攔截所有的飛彈,請計算這一天的最小使用代價。

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

第二行包含1 個整數n(1 ≤ n ≤ 100000)。表示有n 顆飛彈。

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

所有座標分量的絕對值都不超過1000。

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

0 0 10 0 

2 -3 3

10 0

18

0 0 6 0 

5 -4 -2

-2 3

4 0

6 -2

9 1

30
每個測試點1s。

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

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

樣例1說明:

樣例1 中要攔截所有飛彈,在滿足最小使用代價的前提下,兩套系統工作半徑的平方分 別為18 和0。

樣例2說明:

樣例中的飛彈攔截系統和飛彈所在的位置如下圖所示。要攔截所有飛彈,在滿足最小使用代價的前提下,兩套系統工作半徑的平方分別為20 和10。

noip2010普及組

解析:假設兩個飛彈系統為p1、p2,那麼我們可以通過列舉兩個飛彈系統的半徑,取其最小值。

飛彈系統的半徑必然是所在位置與某一飛彈的連線,基於此,p1的可能半徑就只有n種,現在的問題就是列舉p1的半徑之後,如何得到p2的半徑?

我們把所有的點按照到p1的距離從大到小進行排序,若選擇 k 號點到p1的距離作為半徑,那麼k點之後的點都能被p1擊落。而k點之前的點p1是夠不到的,只能由p2擊落,於是,p2的半徑即為前 k-1個點到 p2 的最大半徑。

**:

#include#include#include#includeusing namespace std;

const int maxn=1e5;

struct tnodep[maxn+20];

int getin()

bool cmp(tnode a,tnode b)

int main()

{ int x1,y1,x2,y2;

int n,i,j,k,r2,ans;

x1=getin(),y1=getin();

x2=getin(),y2=getin();

n=getin();

for(k=0;k

NOIP 2010 飛彈攔截

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

noip2010 飛彈攔截

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

noip2010飛彈攔截

洛谷的題。在此省略題目。這題還是比較水的。開始想用字首s1和與字尾s2和做。後來發現是不是。沒辦法還是自己太菜了。其實這道題很簡單。就是給兩個點,然後一系列的點,問以這兩個點為圓心的半徑平方後之和最小是多少。我們可以用結構體排序做。用乙個結構體陣列a i s1和a i s2如下 struct dra...