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 02 -3 3
10 0
18
0 0 6 05 -4 -2
-2 3
4 0
6 -2
9 1
每個測試點1s。30
兩個點(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...