codevs 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

數據範圍及提示 Data Size & Hint

本題可以用貪心

倒敘枚舉時間i
對於每一秒,查找這一秒出現的地鼠的最大價值
減去這個最大的,。
最後即可得到結果~

代碼::

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<stack>
#include<cstdlib>
#include<string>
#include<bitset>
#include<iomanip>
#include<deque>
#define INF 1000000000
#define fi first
#define se second
#define N 100005
#define P 1000000007
#define debug(x) cerr<<#x<<"="<<x<<endl
#define MP(x,y) make_pair(x,y)
using namespace std;
int n,m,ma=0,dp[101][10001];
int t[101],f[101]; 
inline int get_num()
{
int num = 0;
char c;
bool flag = false;
while ((c = getchar()) == ' ' || c == '\n' || c == '\r');
if (c == '-') flag = true;
else num = c - '0';
while (isdigit(c = getchar()))
num = num * 10 + c - '0';
return (flag ? -1 : 1) * num;
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>t[i];
    }
    int sum=0;
    for(int j=1;j<=n;j++)
    {
        cin>>f[j];
    }
    for(int i=n;i>0;i--)
    {
        int maxx=0,k=0;
        for(int j=1;j<=n;j++)
        {
            if(t[j]>=i&&f[j]>maxx)
            {
                maxx=f[j];
                k=j;
            }
        }
        f[k]=0;
        sum+=maxx;
    }
    cout<<sum;


}

一一一一一
噫、
233333

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章