codevs 1052:地鼠遊戲
http://codevs.cn/problem/1052/
題目描述 Description
王鋼是一名學習成績優異的學生,在平時的學習中,他總能利用一切時間認真高效地學習,他不但學習刻苦,而且善於經常總結、完善自己的學習方法,所以他總能在每次考試中得到優異的分數,這一切很大程度上是由於他是一個追求效率的人。
但王鋼也是一個喜歡玩的人,平時在學校學習他努力克制自己玩,可在星期天他卻會抽一定的時間讓自己玩一下,他的爸爸媽媽也比較信任他的學習能力和學習習慣,所以在星期天也不會象其他家長一樣對他抓緊,而是允許他在星期天上午可以自由支配時間。
地鼠遊戲是一項需要反應速度和敏捷判斷力的遊戲。遊戲開始時,會在地板上一下子冒出很多地鼠來,然後等你用榔頭去敲擊這些地鼠,每個地鼠被敲擊後,將會增加相應的遊戲分值。問題是這些地鼠不會傻傻地等你去敲擊,它總會在冒出一會時間後又鉆到地板下面去(而且再也不上來),每個地鼠冒出後停留的時間可能是不同的,而且每個地鼠被敲擊後增加的遊戲分值也可能是不同,為了勝出,遊戲參與者就必須根據每個地鼠的特性,有選擇地盡快敲擊一些地鼠,使得總的得分最大。
這個極具挑戰性的遊戲王鋼特別喜歡,最近他經常在星期天上午玩這個遊戲,慢慢地他不但敲擊速度越來越快(敲擊每個地鼠所需要的耗時是1秒),而且他還發現了遊戲的一些特征,那就是每次遊戲重新開始後,某個地鼠冒出來後停留的時間都是固定的,而且他記錄了每個地鼠被敲擊後將會增加的分值。於是,他在每次遊戲開始後總能有次序地選擇敲擊不同的地鼠,保證每次得到最大的總分值。
輸入描述 Input Description
輸入包含3行,第一行包含一個整數n(1<=n<=100)表示有n個地鼠從地上冒出來,第二行n個用空格分隔的整數表示每個地鼠冒出後停留的時間,第三行n個用空格分隔的整數表示每個地鼠被敲擊後會增加的分值(<=100)。每行中第i個數都表示第i個地鼠的信息。
輸出描述 Output Description
輸出只有一行一個整數,表示王鋼所能獲得的最大遊戲總分值。
樣例輸入 Sample Input
5
5 3 6 1 4
7 9 2 1 5
樣例輸出 Sample Output
24
芒果君:這是一道用優先隊列(堆)優化的貪心題。由於停留時間更長的地鼠更容易被選擇,將時間選為關鍵字由大到小排序,開始貪心:將停留時間等於當前時間的地鼠的分數放入優先隊列,如果隊列不為空,就累計分數、彈出元素。最後輸出總分數。
1 #include<cstdio> 2 #include<algorithm> 3 #include<queue> 4using namespace std; 5 priority_queue<int>heat; 6 int n,i,T,k,ans; 7 struct X{ 8 int t,s; 9 }a[110]; 10 bool cmp(X a,X b) 11 { 12 return a.t>b.t; 13 } 14 int main() 15 { 16 scanf("%d",&n); 17 for(i=1;i<=n;++i) 18 { 19 scanf("%d",&a[i].t); 20 } 21 for(i=1;i<=n;++i) 22 { 23 scanf("%d",&a[i].s); 24 } 25 sort(a+1,a+n+1,cmp); 26 T=a[1].t,k=1; 27 while(T) 28 { 29 while(a[k].t==T) 30 { 31 heat.push(a[k].s); 32 k++; 33 } 34 if(!heat.empty()) 35 { 36 ans+=heat.top(); 37 heat.pop(); 38 } 39 T--; 40 } 41 printf("%d",ans); 42 return 0; 43 }
codevs 1052:地鼠遊戲