某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈。
輸入飛彈依次飛來的高度(雷達給出的高度資料是\le 50000≤50000的正整數),計算這套系統最多能攔截多少飛彈,如果要攔截所有飛彈最少要配備多少套這種飛彈攔截系統。
11行,若干個整數(個數\le 100000≤100000)
22行,每行乙個整數,第乙個數字表示這套系統最多能攔截多少飛彈,第二個數字表示如果要攔截所有飛彈最少要配備多少套這種飛彈攔截系統。
輸入 #1
389 207 155 300 299 170 158 65輸出 #1
6為了讓大家更好地測試n方演算法,本題開啟spj,n方100分,nlogn200分2
每點兩問,按問給分
注意:upper_bound函式和lower_bound函式可以傳遞第四個引數導致功能發生改變
題解:此題資料量過大,用o(n*n)會超時,所以就需要用到另一種方法:二分查詢,之前我有說過c++自帶查詢函式:
這道題的思路就是利用查詢函式,基本思路是找到最長的降序序列,序列用d[i]來儲存,首先將len1=1,d[len1++]=a[1];a陣列是資料輸入的高度
如果之後的a[i]小於等於d[len1],直接將a[i]接到d[len1++]的後面,否則就利用upper_bound(加上greater())函式找出d陣列中第乙個小於a[i]的數,用a[i]替換掉
至於為什麼要這麼做我舉個例子
d1陣列:389 207 155
如果此時a[i]等於300,d1陣列應不應該更新,首先d1陣列是要找到最長的降序子串行,那麼d1的左側應該盡量的大(左側插入元素的空間就很大),d1的右側應該盡量的小(右邊插入的元素也會增多)這樣才能夠保證找到最長的
綜合上述,此時d1中的207應該更換成300,也就是我上面說的找到第乙個小於a[i]的元素,用a[i]替換掉
同理對於用幾個系統就是找最長公升序的
c++**如下:
#include#includeusing
namespace
std;
const
int n=100010
;int
a[n],d1[n],d2[n],n;
intmain()
if(d2[len2]<=a[i])d2[++len2]=a[i]; //
同上else
}cout
/輸出return
0; //
結束}
P1020 飛彈攔截
題目描述 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈。輸入飛彈依次飛來的高度...
P1020 飛彈攔截
某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈。輸入飛彈依次飛來的高度 雷達給出...
P1020 飛彈攔截
原題鏈結 貪心 記錄每套系統攔截過的最小高度 新來的飛彈 如果高於所有飛彈的最低高度 那就只能再加一套了嘛 如果低於某些系統的最低高度 那就貪心 把它加到 最低高度最低的一套系統內 include include include include include include include inc...