最少攔截系統 HDU 1257(水題 貪心)

2021-10-03 12:35:17 字數 1559 閱讀 7024

題目:

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

怎麼辦呢?多搞幾套系統唄!你說說倒蠻容易,成本呢?成本是個大問題啊.所以俺就到這裡來求救了,請幫助計算一下最少需要多少套攔截系統.

input

輸入若干組資料.每組資料報括:飛彈總個數(正整數),飛彈依此飛來的高度(雷達給出的高度資料是不大於30000的正整數,用空格分隔)

output

對應每組資料輸出攔截所有飛彈最少要配備多少套這種飛彈攔截系統.

sample input

8 389 207 155 300 299 170 158 65

sample output

2source

思路:典型的貪心演算法,最少是1個系統。按順序檢測飛彈高度h,記錄所有系統能達到高度最大值hmax,共三種情況:

(對應**一)

1.h = hmax 無需調整,使用最高高度攔截,無影響

2.h > hmax 加攔截系統,更新hmax

3.h < hmax 找到攔截高度與之最接近且大於h的系統,該系統最大攔截高度調為h,若恰好為最高攔截系統,更新hmax

(對應**二)

1.h[h] 為真,無需調整,使用相同高度系統攔截,無影響

2.同上

3.同上

一些小細節:

1.所有系統高度不會重複(就不證明啦,挺好想通的),所以陣列大小不必超過30000,輸出也不會大於30000

2.本題可以不用排序,只進行搜尋即可

3.變數需要初始化,且最少也需1個系統

**×2:

int n;

for(

int n;

scanf

("%d"

,&n)==1

;);//各個系統攔截高度

int h, hmax =

0, ans =0;

while

(n--

)else

if(h[idx]

== hmax) hmax = h;

//更新 hmax

h[idx]

= h;}}

cout << ans << endl;

}

int n;

for(

int n;

scanf

("%d"

,&n)==1

;);//若i為某系統最大攔截高度 h[i]為真

int h, hmax =

0, ans =0;

while

(n--

)else}}

cout << ans << endl;

}

hdu1257 最少攔截系統

解釋 當炮彈乙個接乙個的從空中飛來時,系統可以攔住比它攔住前乙個高度低的炮,比前乙個高的不攔,給第二個系統攔 problem description 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統.但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能超過...

hdu 1257 最少攔截系統

題目大意 給定一串飛彈的高度,問最少需要多少飛彈攔截系統。思路 lis 分析 首先,至少需要一套攔截系統,一開始可以打到第一顆飛彈的位置。之後每來一顆飛彈更新一下系統能打到的高度。一旦有一顆飛彈所有系統都打不到了,增加乙個系統。那麼就會得到乙個序列,每個系統目前能打到的最高位置。這個序列是遞增的,後...

HDU1257 最少攔截系統

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