算算排几名
描述
在某次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);
}
}