problem description
某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統.但是這種飛彈攔截系統有乙個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能超過前一發的高度.某天,雷達捕捉到敵國的飛彈來襲.由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈.
怎麼辦呢?多搞幾套系統唄!你說說倒蠻容易,成本呢?成本是個大問題啊.所以俺就到這裡來求救了,請幫助計算一下最少需要多少套攔截系統.
input
輸入若干組資料.每組資料報括:飛彈總個數(正整數),飛彈依此飛來的高度(雷達給出的高度資料是不大於30000的正整數,用空格分隔)
output
對應每組資料輸出攔截所有飛彈最少要配備多少套這種飛彈攔截系統.
sample input
8 389 207 155 300 299 170 158 65
sample output2
這題看起來很難,其實真的只是求乙個嚴格的最長上公升子串行.
分析一下:
飛彈序列是要求非公升序的,後面的每乙個飛彈高度不能高於前乙個。現在就是統計有多少個非公升序的飛彈序列。
我們不妨設定乙個陣列,每乙個元素代表某乙個飛彈序列的當前最後乙個飛彈的高度。
(1)如果我們發現當前飛彈的高度比這之前所有飛彈序列的最後乙個飛彈高度都高,那我們必須增加乙個新的飛彈序列(即陣列長度+1,新增陣列元素為當前飛彈高度)。
(2)如果我們發現當前飛彈的高度比之前某個或某些飛彈序列最後乙個飛彈高度小,那我們可以把這個飛彈放入這個序列中(即更新某個飛彈序列的最後乙個飛彈高度,用當前的飛彈高度替換)。
當然根據貪心原則,我們 選擇替換的序列 應該是 所有可以被替換的序列中最後乙個飛彈高度最小 的。
總結上文,發現這是求乙個最長上公升問題。
**採用了,stl庫的lower_bound函式進行二分查詢。時間複雜度為
#include #include using namespace std;
int a[100010];
int d[100010];
int main()
else
}printf ("%d\n",len+1);
} return 0;
}
hdu1257 最少攔截系統
解釋 當炮彈乙個接乙個的從空中飛來時,系統可以攔住比它攔住前乙個高度低的炮,比前乙個高的不攔,給第二個系統攔 problem description 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統.但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能超過...
hdu 1257 最少攔截系統
題目大意 給定一串飛彈的高度,問最少需要多少飛彈攔截系統。思路 lis 分析 首先,至少需要一套攔截系統,一開始可以打到第一顆飛彈的位置。之後每來一顆飛彈更新一下系統能打到的高度。一旦有一顆飛彈所有系統都打不到了,增加乙個系統。那麼就會得到乙個序列,每個系統目前能打到的最高位置。這個序列是遞增的,後...
HDU1257 最少攔截系統
problem description 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統.但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能超過前一發的高度.某天,雷達捕捉到敵國的飛彈來襲.由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有...