CODEVS——T1052 地鼠遊戲
王鋼是一名學習成績優異的學生,在平時的學習中,他總能利用一切時間認真高效地學習,他不但學習刻苦,而且善於經常總結、完善自己的學習方法,所以他總能在每次考試中得到優異的分數,這一切很大程度上是由於他是一個追求效率的人。
但王鋼也是一個喜歡玩的人,平時在學校學習他努力克制自己玩,可在星期天他卻會抽一定的時間讓自己玩一下,他的爸爸媽媽也比較信任他的學習能力和學習習慣,所以在星期天也不會象其他家長一樣對他抓緊,而是允許他在星期天上午可以自由支配時間。
地鼠遊戲是一項需要反應速度和敏捷判斷力的遊戲。遊戲開始時,會在地板上一下子冒出很多地鼠來,然後等你用榔頭去敲擊這些地鼠,每個地鼠被敲擊後,將會增加相應的遊戲分值。問題是這些地鼠不會傻傻地等你去敲擊,它總會在冒出一會時間後又鉆到地板下面去(而且再也不上來),每個地鼠冒出後停留的時間可能是不同的,而且每個地鼠被敲擊後增加的遊戲分值也可能是不同,為了勝出,遊戲參與者就必須根據每個地鼠的特性,有選擇地盡快敲擊一些地鼠,使得總的得分最大。
這個極具挑戰性的遊戲王鋼特別喜歡,最近他經常在星期天上午玩這個遊戲,慢慢地他不但敲擊速度越來越快(敲擊每個地鼠所需要的耗時是1秒),而且他還發現了遊戲的一些特征,那就是每次遊戲重新開始後,某個地鼠冒出來後停留的時間都是固定的,而且他記錄了每個地鼠被敲擊後將會增加的分值。於是,他在每次遊戲開始後總能有次序地選擇敲擊不同的地鼠,保證每次得到最大的總分值。
輸入包含3行,第一行包含一個整數n(1<=n<=100)表示有n個地鼠從地上冒出來,第二行n個用空格分隔的整數表示每個地鼠冒出後停留的時間,第三行n個用空格分隔的整數表示每個地鼠被敲擊後會增加的分值(<=100)。每行中第i個數都表示第i個地鼠的信息。
輸出描述 Output Description輸出只有一行一個整數,表示王鋼所能獲得的最大遊戲總分值。
樣例輸入 Sample Input5
5 3 6 1 4
7 9 2 1 5
樣例輸出 Sample Output24
數據範圍及提示 Data Size & Hint 貪心:給分數排降序,在最早的時間得到目前最高分,用got[i]標記,表示i秒已經用過敲地鼠了1 #include <algorithm> 2 #include <cstdio> 3 4 using namespace std; 5 6 const int N(119); 7 int n,ans,got[N]; 8 9 struct Node 10 { 11 int tim,val; 12 }diglett[N]; 13 bool cmp(Node a,Node b) 14 { 15 return a.val>b.val; 16 } 17 18 int main() 19 { 20 scanf("%d",&n); 21 for(int i=1;i<=n;i++) 22 scanf("%d",&diglett[i].tim); 23 for(int i=1;i<=n;i++) scanf("%d",&diglett[i].val); 24 sort(diglett+1,diglett+n+1,cmp); 25 for(int i=1;i<=n;i++) 26 for(int j=diglett[i].tim;j>0;j--) 27 { 28 if(got[j]) continue; 29 got[j]=1; 30 ans+=diglett[i].val; 31 break; 32 } 33 printf("%d",ans); 34 return 0; 35 }View Code
DP :01背包-->先給tim派升序,處理每個時間每個地鼠該不該敲、
1 #include <algorithm> 2 #include <cstdio> 3 4 using namespace std; 5 6 const int N(119); 7 int n,ans,max_tim,got[N],f[N]; 8 struct Node 9 { 10 int val,tim; 11 }mouse[N]; 12 bool cmp(Node a,Node b) 13 { 14 return a.tim<b.tim; 15 } 16 17 int main() 18 { 19 scanf("%d",&n); 20 for(int i=1;i<=n;i++) 21 scanf("%d",&mouse[i].tim),max_tim=max(max_tim,mouse[i].tim); 22 for(int i=1;i<=n;i++) scanf("%d",&mouse[i].val); 23 sort(mouse+1,mouse+n+1,cmp); 24 for(int i=1;i<=n;i++) 25 for(int j=mouse[i].tim;j>0;j--) 26 f[j]=max(f[j],f[j-1]+mouse[i].val); 27 for(int i=1;i<=max_tim;i++) ans=max(ans,f[i]); 28 printf("%d",ans); 29 return 0; 30 }View Code
CODEVS——T1052 地鼠遊戲