C語言貪心 3

2021-06-27 19:43:18 字數 1571 閱讀 9513

problem description

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

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

input

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

output

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

sample input

8 389 207 155 300 299 170 158 65

sample output

2

這道題是乙個貪心題。

具體貪心過程就是:

每次讀入乙個飛彈高度,先判斷是否有炮可以攔截,如果沒有就要再加乙個攔截系統,如果可以攔截,就要選擇乙個攔截系統當前高度和目標飛彈高度相差值最小的。這樣才能使高度損失達到最低.換句話說,現在有3個攔截系統,目前的最高高度分別是100,90, 80,現在要攔截乙個85的炮彈那麼只能在100和90選乙個,因為90和85相差比較近,高度損失小,所以選擇90的這個攔截系統進行攔截.

具體**實現思路:

用乙個陣列f [ ]表示當前的攔截系統個數已經分別的目前攔截高度.最開始只有乙個,攔截高度自然是第一枚飛彈的打擊高度,然後每次讀入乙個飛彈的打擊高度h.然後在f [ ]陣列中從左f [ 0 ]開始找乙個位置i使得f [ i ] > h > f [ i-1 ]當然如果f [ 0 ]h大,那麼i自然就是0,找到了說明當前i的攔截系統就是能夠使高度損失最低的攔截系統,然後將該攔截系統的高度改為h,表示當前攔截系統已經把h的這個飛彈攔截,如果沒找到滿足上式的這個位置i說嘛當前h已經超過了所有攔截系統的攔截高度,那麼我們就要再加入乙個攔截系統,並把這個攔截系統的攔截高度改為h加入到f [ ]最後表示已經攔截了h這個飛彈。

最重要的:

在查詢i位置的時候使用:

二分查詢!!

#include #include using namespace std;

#include int main()

else if(f[mid]<=a)

l=mid+1;

else

r=mid-1;

}if(l

C語言貪心法

c語言有這樣乙個規則 每乙個符號應該包含盡可能多的字元。也就是說,編譯器將程式分解成符號的方法是,從左到右乙個乙個字元的讀入,如果該字元可能組成乙個符號,那麼再讀入下乙個字元,判斷已經讀入的兩個字串是否可能是乙個符號的組成部分 如果可能,繼續讀入下乙個字元,重複上述判斷,直到讀入的字元組成的字串已不...

C語言 貪心 活動選擇

time limit 1000ms memory limit 65536kb submit statistic problem description 學校的大學生藝術中心週日將面向全校各個學院的學生社團開放,但活動中心同時只能供乙個社團活動使用,並且每乙個社團活動開始後都不能中斷。現在各個社團都提...

C語言 貪心 迷瘴

time limit 1000ms memory limit 65536kb submit statistic problem description 通過懸崖的yifenfei,又面臨著幽谷的考驗 幽谷周圍瘴氣瀰漫,靜的可怕,隱約可見地上堆滿了骷髏。由於此處長年不見天日,導致空氣中布滿了毒素,一旦...