西南交通大学2019ACM集训队选拔训练赛 A题

西南交通大学2019ACM集训队选拔训练赛 A题

算算排几名
描述

在某次ACM比赛中,一共有8道题,分别是A, B, C… H题。题目难度随机分布,最终成绩与AC数目和时间都有关系,具体的排名计算规则如下:若两人AC题目个数不同,则AC题目数多的人排名更靠前;若两人AC题目一样多,则罚时少的人排名更靠前。罚时为:从比赛开始计时,在所有AC的题目中,第一次AC的时间(分钟)+20(分钟)×该题错误提交的次数(编译错误"Compile Error" 不算罚时)。

如:某人在比赛开始 12分时A题 “Compile Error” 24分时A题 “Wrong Answer” 36分时A题"Accepted" 48分时B题"Time Limit Exceeded" 60分时E题"Accepted" 72分钟时B题 “Accepted” 84分时F题"Wrong Answer" 96分时F题"Wrong Answer" 108分时F题"Wrong Answer"。则此人AC题目数量为3题, 总罚时为 20+36+20+60+72=208分

输入

多组测试数据,第一行一个整数T(1<=T<=100),表示包含t组测试数据

每组测试数据第一行包含一个整数n(1<=n<=1000),表示n条提交记录

接下来n行,每行包含一个整数t(0<=t<=300)表示提交时间,一个字符 ch(‘A’ <= ch <= ‘H’)表示提交题号 和一个字符串 str 表示某次提交结果。"Accepted"表示该题正确通过(即AC); "Wrong Answer"表示该题答案错误; "Time Limit Exceeded"表示程序运行时间超出规定时间; "Runtime Error"表示程序运行时发生错误,可能是数组访问越界,除零错误,栈溢出等; “Compile Error” 表示程序编译没有通过; “Memory Limit Exceeded” 表示程序使用内存过多。在错误提交之中,只有 "Compile Error"不计入罚时

输出

每组数据输出一行,包含两个整数a, b 表示AC题目数量和总罚时

输入样例 1

1
9
12 A Compile Error
24 A Wrong Answer
36 A Accepted
48 B Wrong Answer
60 E Accepted
72 B Accepted
84 F Wrong Answer
96 F Wrong Answer
108 F Wrong Answer

输出样例 1

3 208

题解
首先,我们在每输入一次后就记录相应的解题时间或罚时,那么一共有八道题,我们可以考虑用一个数组t[]来存放每道题的时间,可以用输入的题号m减去65(字符‘A’的ASCII码)来表示数组元素序数,也就是说A题对应的时间t[0],m题的时间是t[m-65]。
然后,对字符数组进行判断时只需要判断首字母,也就是说,我们判断首字母时’A’,那么就是“Accepted”,以此类推。
每判断一次错误(Wrong Answer,Compile Error…),相应的时间t[]加二十,判断Accepted,加解题所用时间,然而这就有一个问题,当一道题AC以后,这道题再提交的时候无论时AC还是错误都不在计算时间,这是我们就可以加入一个判断语句。
在最后,进行总时间相加的时候,应该是只算AC的题目,因此我们可以用另外一个数组记录AC的题目。

代码

#include
#include
void main()
{
	int T,n,a,b,t[11],x[11],j,i,y,flag,z[11];
	char s[50],m;
	scanf("%d",&T);
	while(T--)
	{
		memset(t,0,sizeof(t));
		memset(x,0,sizeof(x));
		memset(z,0,sizeof(z));
		scanf("%d",&n);
		j=0;
		y=0;
		while(n--)
		{
			scanf("%d %c",&a,&m);
			getchar();
			gets(s);
			b=m-64;
			if(s[0]=='A')
			{
				flag=0;
				for(i=0;i<=9;i++)
					if(b==x[i])
					{
						flag=1;
					    break;
					}
                if(flag==0)
				{
					t[b]+=a;x[j]=b;z[j++]=t[b];
				}
			}
			else if(s[0]=='W'||s[0]=='R'||s[0]=='M'||s[0]=='T')
				t[b]=t[b]+20;
		}
		printf("%d ",j);
		for(i=0;i<=j-1;i++)
		{
			y+=z[i];
		}
		printf("%d\n",y);
	}
}

你可能感兴趣的:(西南交通大学2019ACM集训队选拔训练赛 A题)