1. 程式人生 > >CODEVS——T1052 地鼠遊戲

CODEVS——T1052 地鼠遊戲

獲得 習慣 _id right 數據 cli bre sed show

http://codevs.cn/problem/1052/ 時間限制: 1 s 空間限制: 128000 KB 題目等級 : 鉆石 Diamond 題目描述 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

數據範圍及提示 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 地鼠遊戲