劲乐团是这样一个游戏:
当游戏开始时,一边播放背景音乐,一边从上至下不断随着音乐掉落Note。(Note是音乐游戏的术语)当该Note掉落至最底部时,则按下对应的键就可以击中该Note并得分。
击中的时间越准确得分越高。准确击中可以得到一个COOL,时间稍微有些偏差可以得到一个GOOD。偏差更多或者未击中得到MISS。一个COOL可以得500分,一个GOOD可以得250分。
(注意:如果当某一个键被推迟或提前按下时,该位置正好有另一个Note,那么被响应的将是出现较早的那个音符。)
劲乐团对于按键准确程度的判断是以秒为单位:正好在该秒时击中得到COOL,早或者晚一秒都将得到GOOD。
路路是一个劲乐高手,他用键盘上的S、D、F、G、J、K、L七个键来对应七个位置,挑了一首歌玩了下来,你的任务就是算算路路得了多少分。
输入
输入数据表示了一首歌曲的所有Note的信息和路路的击打键位情况。
第一行里有三个整数N、M和S,N表示了整个歌曲的长度,M表示了这首歌的Note数,S表示了路路击打键位的次数。
接下来m行每行有2个数Ti和Pi,Ti表示该Note到达底部的时间,Pi表示该Note的位置。输入已经按照Ti排序,没有Ti和Pi都相同的两个Note。
接下来S行每行有1个数ti和1个大写字母pi,ti表示路路敲击键盘的时间,pi表示路路敲击键盘的位置。输入已经按照ti排序,不会出现ti和pi都相同的两次敲击。
输出
输出数据是一个整数,即路路所得的分数。
样例
输入
3 3 4
1 1
2 6
3 2
1 S
2 K
2 D
3 D
输出
1250
提示
【数据范围】
N <= 10000000, M <= 5000, S <= 5000
【样例说明】
3个音符。
玩家敲对了第一个(S)、第二个(K),得到两个COOL,500*2=1000分。
第三个时间不对,应该第三秒,敲在了第二秒,相差1秒以内,得到一个GOOD,250分。
第四个超出音符总数,忽略不计。
因此总分1250分。
题目其实很简单,可以用关联数组,或结构体等方法等完成。
传送门
满分代码:
#include<stdio.h>
#include<stdlib.h>
int main() {int N, M, S, i, note[7][5000], noteind[7] = {0, 0, 0, 0, 0, 0, 0}, f['Z'+1];f['S'] = 0, f['D'] = 1, f['F'] = 2, f['G'] = 3, f['J'] = 4, f['K'] = 5,f['L'] = 6;int score = 0, j;for (i = 0; i < 7; i++)for (j = 0; j < 5000; note[i][j] = -100, j++);scanf("%d%d%d", &N, &M, &S);for (i = 0; i < M; i++) {int ti, pi;scanf("%d%d", &ti, &pi);note[pi-1][noteind[pi-1]] = ti;noteind[pi-1]++;}for (i = 0; i < 7; noteind[i] = 0, i++);for (i = 0; i < S; i++) {int ti, pi;char Pi;scanf("%d %c", &ti, &Pi);pi = f[Pi];if (abs(ti-note[pi][noteind[pi]]) == 1)score += 250;if (ti == note[pi][noteind[pi]])score += 500;noteind[pi]++;}printf("%d", score);return 0;
}