浙工大2015年校赛 Problem G: You you rhythm master(贪心题)

题目链接:http://acm.zjut.edu.cn/onlinejudge/problem.php?cid=1100&pid=6

题面:

Problem G: You you rhythm master

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 295   Solved: 134
[ Submit][ Status][ Web Board]

Description

最近Fry迷上了一款叫做rhythm master的游戏,
rhythm master是腾讯出品的山寨音乐游戏,屏幕上会不断的掉下音符,在一定的时间内玩家需要用手指去点击下落的音符,根据点击的时间不同分别获得Perfect ,Great,和Miss的评价并获得不同的分数.
分数的计算规则如下:
1,初始的combo数为0.
2,每获得一个Perfect, combo数加一,然后根据当前的combo分别获得不同的分数,combo在0到20(包括20)之间时获得200分,combo在20到50(包括50)之间获得 332 分,combo在50到100(包括100)之间获得466分,combo在100以上获得600分. 
3,每获得一个Great, combo数加一,然后根据当前的combo分别获得不同的分数,combo在0到20(包括20)之间时获得80分,combo在20到50(包括50)之间获得 132 分,combo在50到100(包括100)之间获得186 分,combo在100以上获得240分.
4,每获得一个Miss,不得分,同时combo数清零.
现在已经知道最后Fry获得的Perfect ,Great,和Miss的数量,你需要做的就是求出Fry最终有可能获得的最大得分.

输入
第一行是一个T(T<=100),表示接下来有T组数据.
接下来T行,每行有三个数P,G,M,分别表示一首歌中Fry获得的Perfect ,Great,和Miss的数量,(0<=P,G,M<=1000).还是不懂的自行百度节奏大师规则…

Input

第一行是一个T(T<=100),表示接下来有T组数据.
接下来T行,每行有三个数P,G,M,分别表示一首歌中Fry获得的Perfect ,Great,和Miss的数量,(0<=P,G,M<=1000).

Output

每组数据对应输出一行,每行一个数,表示Fry所能获得的最高分数.

Sample Input

2
1 1 1 
100 2 0

Sample Output

280
38220

HINT

题意挺清晰的,就是节奏大师的玩法吧。
贪心策略:M最前或者最后,G在P的前面,这样才可以让P的得分更高。

根据p g两点的相对移动来写计算公式,虽然繁琐了些,结合图示还是能较容易写正确的。

浙工大2015年校赛 Problem G: You you rhythm master(贪心题)_第1张图片

代码:

#include <iostream>
#include <string.h>
#include <cstdio>
#include <queue>
using namespace std;

int main()
{
    int t,p,g,m,ans;
    scanf("%d",&t);
	while(t--)
	{
		ans=0;
		scanf("%d%d%d",&p,&g,&m);
		if(g<=20)ans+=g*80;
		else if(g<=50)ans+=(20*80+(g-20)*132);
		else if(g<=100)ans+=(20*80+30*132+(g-50)*186);
		else ans+=(20*80+30*132+50*186+(g-100)*240);
		p+=g;
		if(p<=20)ans+=(p-g)*200;
		else if(p<=50)
		{
			if(g<=20)
			{
				ans+=((20-g)*200+(p-20)*332);
			}
			else
			{
				ans+=(p-g)*332;
			}
		}
		else if(p<=100)
		{
			if(g<=20)ans+=((20-g)*200+30*332+(p-50)*466);
			else if(g<=50)ans+=((50-g)*332+(p-50)*466);
			else ans+=(p-50)*466;
		}
		else
		{
			if(g<=20)ans+=((20-g)*200+30*332+50*466+(p-100)*600);
			else if(g<=50)ans+=((50-g)*332+50*466+(p-100)*600);
			else if(g<=100)ans+=((100-g)*466+(p-100)*600);
			else ans+=(p-g)*600;
		}
		printf("%d\n",ans);
	} 
	return 0;
}


你可能感兴趣的:(入门,水题,贪心,简单题)