Live2D

CSU - 2058 跳一跳

Description

冰弦非常热衷于过气微信小游戏“跳一跳”,现在给出了他每次游戏时的一些信息,请你帮他计算一下每局游戏的得分。

跳一跳的游戏规则如下:

  • 玩家操控一个小棋子,在形状各异的“盒子”上边一路往前跳,当棋子跌落盒子之外时则游戏结束。
  • 盒子的正中心为“完美落点”,其他为“普通落点”。
  • 每次跳跃如果成功跳到了一个新的盒子上,记为“有效跳跃”,该落点为“有效落点”。
  • 每次有效跳跃结束时,如果存在上一次有效跳跃且距离上一次有效跳跃结束的时间不超过1秒,则本次有效跳跃记为“快速跳跃”。
  • 每次有效跳跃可以获得一定的分数。
    • 如果当前落点为完美落点,而且上一次有效落点存在且为完美落点,那么此次跳跃的得分为上次有效跳跃的得分+2。
    • 如果当前落点为完美落点,上一次有效落点存在且为普通落点,而且上次跳跃或者此次跳跃为快速跳跃,那么此次跳跃的得分为4分。
    • 如果当前落点为完美落点,上一次有效落点不存在或为普通落点,而且此次跳跃也不是快速跳跃,那么此次跳跃的得分为2分。
    • 如果当前落点为普通落点,而且此次跳跃是快速跳跃,那么此次跳跃的得分为2分。
    • 其他情况下,得分为1分。
  • 对于一些特殊的盒子,棋子在上面逗留1秒就可以获得额外的加分。
    • 魔方:额外得分为10分。
    • 便利店:额外得分为20分。
    • 音乐盒:额外得分为30分。
  • 如果某两次有效跳跃结束之间(或最后一次死亡跳跃结束和前一次有效跳跃结束之间,参见样例第5、6局游戏)的间隔不少于2秒,我们认为玩家在上一个盒子上逗留了1秒。

Input

输入包含不超过10组数据,每组数据描述了冰弦的一局游戏。

每组数据有若干行,除最后一行外,每一行描述一次有效跳跃(总有效跳跃数不超过105),格式为“跳跃结束的时间 落点 盒子类型”;最后一行是“跳跃结束的时间 GAME OVER”,表示小棋子跌落盒子之外,游戏结束。

“跳跃结束的时间”为一个不超过109的整数,单位为毫秒。

“落点”为一个字符串,“Perfect”表示完美落点,“Good”表示普通落点。

“盒子类型”为一个字符串,“Rubik”表示魔方,“Store”表示便利店,“Music”表示音乐盒,“Box”表示普通盒子。

保证数据合法地描述了一局正常有效的游戏。

更多输入格式的信息请参考样例输入。

Output

对于每组数据,输出一行一个整数,表示冰弦在此局游戏中获得的分数。

Sample Input

1000 Good Box
3000 Good Box
5000 Good Box
7000 GAME OVER
1000 Good Box
2000 Good Box
3000 Good Box
4000 GAME OVER
1000 Perfect Box
2000 Perfect Box
3000 Perfect Box
4000 GAME OVER
1000 Perfect Rubik
2000 Perfect Store
4000 Perfect Music
8000 Perfect Box
16000 GAME OVER
4000 Perfect Rubik
5000 Perfect Rubik
9000 GAME OVER
4000 Perfect Rubik
8000 Perfect Rubik
16000 GAME OVER

Sample Output

3
5
12
70
16
26

Hint

对于第一局游戏,得分为 1+1+1=3 ;
对于第二局游戏,得分为 1+2+2=5 ;
对于第三局游戏,得分为 2+4+6=12 ;
对于第四局游戏,得分为 2+4+20+6+30+8=70 。

冰弦不会手抖进行“无效跳跃”的,不用纠结“无效跳跃”的问题。

Source

Author

devenber


#include<cstdio>
#include<iostream>
#include<string>
using namespace std;
long long tim,tim_last;
long long flag,flag1,flag2,num,cnt;
string s1, s2,s11,s22;
string c1 = "Good", c2 = "Perfect", c3 = "GAME";
string  a1 = "Rubik", a2 = "Store", a3 = "Music";
int main()
{
	int cas = 0;
	flag=flag1=flag2 = 0; num = 0; cnt = 0; tim_last = 0;
	while ((cin >> tim >> s1 >> s2)&&(cas)<=10)
	{
		if (flag && (tim - tim_last) <= 1000)
			flag1 = 1;
		else
			flag1 = 0;
		if ((tim - tim_last) >= 2000)
		{
			if (s22 == a1)
				num += 10;
			else if (s22 == a2)
				num += 20;
			else if (s22 == a3)
				num += 30;
		}
		if (s1 == c2)
		{
			if (flag == 2){
				flag = 2;
				cnt += 2; num += cnt;
			}
			else if (flag == 1 && (flag1 || flag2)){
				flag = 2;
				cnt = 4; num += cnt;
			}
			else if ((flag == 0 || flag == 1) && flag1 == 0) {
				flag = 2;
				cnt = 2; num += cnt;
			}
			else{
				flag = 2;
				cnt = 1; num += cnt;
			}
		}
		else if (s1 == c1)
		{
			if (flag1 == 1)
			{
				flag = 1;
				cnt = 2; num += cnt;
			}
			else
			{
				flag = 1;
				cnt = 1;
				num += cnt;
			}
		}
		else if (s1 == c3)
		{
			printf("%lld\n", num);
			cas++;
			tim_last = 0;
			flag2 = 0;
			flag = 0; flag1 = 0; cnt = 0; num = 0;
			s11 = "0"; s22 = "0";
			continue;
		}
		tim_last = tim;
		flag2 = flag1;
		s11 = s1, s22 = s2;
	}
	return 0;
}


posted @ 2018-04-19 20:11  ITryagain  阅读(195)  评论(0编辑  收藏  举报