辽哥游戏
Description
張遼是一個(gè)長發(fā)飄飄的非常聰明的男孩,人人都稱他為“遼哥”。遼哥喜歡玩一個(gè)有趣的電腦游戲。這個(gè)游戲開始的時(shí)候有n個(gè)碉堡,每個(gè)碉堡擁有一個(gè)防御值和一個(gè)附加值。玩家擁有一個(gè)初始的攻擊力。如果玩家破壞了一個(gè)碉堡,則他能得到1分。每一次,遼哥會(huì)選擇一個(gè)碉堡進(jìn)行攻擊。所有未被破壞的碉堡會(huì)聯(lián)合起來防御,因此為了破壞那個(gè)碉堡,遼哥的攻擊力必須大于或者等于所有未被破壞的碉堡的防御值之和,否則遼哥就會(huì)輸?shù)粲螒?。如果遼哥成功破壞了那個(gè)碉堡,那么他的攻擊力會(huì)變成那個(gè)碉堡的附加值,然后他可以選擇下一個(gè)攻擊的目標(biāo)。
由于遼哥擁有強(qiáng)大的編程能力,他不費(fèi)吹灰之力就改寫了那個(gè)游戲。在游戲開始前,他可以用炸彈消滅任意的碉堡,但是他不能通過這種方式來獲得分?jǐn)?shù)。問題來了,在游戲開始后,遼哥可以得到的最大分?jǐn)?shù)是多少?
Input
輸入包含多組(不超過100組)測試數(shù)據(jù)。
每組測試數(shù)據(jù)的第一行包含一個(gè)正整數(shù)N,表示測碉堡的數(shù)目。接下來有N行,每行包括2個(gè)非負(fù)整數(shù)。第i+1行的2個(gè)整數(shù)分別表示第i個(gè)碉堡的防御值和附加值。最后還有一行,為一個(gè)整數(shù),表示遼哥在游戲開始時(shí)的初始攻擊力。
輸入以文件結(jié)束符結(jié)束。
Output
對每組數(shù)據(jù),輸出一行,為一個(gè)整數(shù),表示遼哥可以拿到的最大分?jǐn)?shù)。
Sample Input
3
10 9
25 30
8 7
50
5
100 230
334 331
33 288
35 100
334 22
600
Sample Output
3
4
Data Constraint
Hint
【數(shù)據(jù)范圍】
對20%的數(shù)據(jù),有N<=10;
對40%的數(shù)據(jù),有N<=100;
對100%的數(shù)據(jù),有N<=1000,每個(gè)碉堡的防御值和附加值均不會(huì)超過2000000。
.
.
.
.
.
分析
開始時(shí)將若干個(gè)碉堡炸掉的操作有點(diǎn)難處理,我們考慮倒著做。
設(shè) f[i] 表示選的最后 i 個(gè)碉堡(任意選)的所需的最小攻擊力。
設(shè)第 j個(gè)碉堡的防御值和附加值分別為 b[j],d[j] ,
則有 f[i]=min{f[i?1]+b[j]} (d[j]≥f[i?1])。
還有碉堡要按 b+d從小到大排序(顯然 b+d小的后選更優(yōu))。
這樣處理完之后選一個(gè)最大的 f[i] 使得初始攻擊力 m≥f[i]即滿足題意,輸出此時(shí)的 i即可。
時(shí)間復(fù)雜度 O(T?n*n)。
.
.
.
.
.
程序:
轉(zhuǎn)載于:https://www.cnblogs.com/YYC-0304/p/11094929.html
總結(jié)