1. 程式人生 > >[BZOJ 3709] Bohater

[BZOJ 3709] Bohater

esc 狀態 con 最大 scrip 問題 整數 如果 第一個

Description

在一款電腦遊戲中,你需要打敗n只怪物(從1到n編號)。為了打敗第i只怪物,你需要消耗d[i]點生命值,但怪物死後會掉落血藥,使你恢復a[i]點生命值。任何時候你的生命值都不能降到0(或0以下)。請問是否存在一種打怪順序,使得你可以打完這n只怪物而不死掉

Input

第一行兩個整數n,z(1<=n,z<=100000),分別表示怪物的數量和你的初始生命值。
接下來n行,每行兩個整數d[i],a[i](0<=d[i],a[i]<=100000)

Output

第一行為TAK(是)或NIE(否),表示是否存在這樣的順序。
如果第一行為TAK,則第二行為空格隔開的1~n的排列,表示合法的順序。如果答案有很多,你可以輸出其中任意一個。

Sample Input

3 5
3 1
4 8
8 3

Sample Output

TAK
2 3 1

Solution:

不難看出這是一個貪心問題,將打完能整體回血的的怪物和打完整體會掉血的分開。

1.因為打能回血的怪時無論消耗多少都能恢復,所以應該先打消耗最少的,到後面才有更大的生命值打最大的,打完第一部分時血量到達最大值,所以應該按消耗從小到大排序。

2.第二部分可以反向思考,將最終狀態作為初始狀態,那麽回血就是掉血,掉血就是回血,因為第二個部分總體掉血,所以反過來總體回血,假設末狀態血量為x,那麽就讓第一個部分結束時盡可能大,反向思考後就成為了第一個部分的問題,按照反向思考後掉血(就是正常情況下的回血)升序排列,反回來就是按照回血降序排列。


總結:

貪心算法在貪心策略滿足無後效性時才能保證正確性。
某些貪心的正確性難以嚴格證明 ,這時可以考慮分部分討論,逆向思考,枚舉多種策略的辦法做貪心。

證明貪心可以舉反例、考慮極端情況或者類比論證。

[BZOJ 3709] Bohater