【2017中国大学生程序设计竞赛

问题描述

输入格式

输出格式

样例输入

1

3 5

1002 00:02 AC

1003 00:05 WA

1003 00:06 WA

1003 00:07 AC

1002 04:59 AC

样例输出

2 49

题解


 题目大意:

一个队伍参加比赛,计算该队伍通过的题数和总罚时。

对于每一次提交,如果结果为AC则该题提交的时间会被计入罚时,此后再提交该题罚时不会增加,每一题AC前每一次提交不通过罚时20分钟。

输入

输入有多组数据,第一行包括一个整数T,表示数据组数,接下来每组数据第一行有两个整数n,m,表示比赛的题目总数和队伍的提交次数。接下来m行每行包括一个整数x和两个字符串t,s,其中x表示题号(格式为1001,1002,……1000+n),t为本次提交的时间,s为提交结果。数据保证00:00<=t<=05:00,且任意两个t不相同。

输出

对于每组数据,输出一行包括两个整数A,B,表示该队伍通过的题数和总罚时。


首先考虑怎么记录通过的题数。我们可以设一个计数器sum,用来统计通过的题数,为防止同一道题被多次计数,我们用一个布尔型数组vis记录该题是否被统计过。考虑到总题数不超过13且题号从1001开始,我们可以在读入时直接把x减1000作为题号,这样可以减小数组的范围。

对于一道题,AC后的提交不计入罚时,AC前每次不通过的提交罚时20分钟,我们再开一个布尔型数组ac,标记一道题目前是否AC过,若已经AC则不需要对该题做任何处理,否则若当前提交AC,则总罚时加上当前提交时间,通过题数加一(为方便计算,可在读入时把提交时间转化为分钟),否则无论提交时间是多少,总罚时加上20。

然后要注意数据输入可能不是按提交时间递增的,最好读入的时候按时间递增排序一下。

 1 #include <algorithm>
 2 #include <cstring>
 3 #include <cstdio>
 4 int n,m,T,ans,sum;
 5 bool ac[15],vis[15],f[15];
 6 char s[10],t[10];
 7 struct node{
 8     int x,p;
 9     bool AC;
10 }pro[105];
11 bool cmp(node x,node y)
12 {
13     return x.p<y.p;
14 }
15 int main()
16 {
17     int i,j,x;
18     scanf("%d",&T);
19     while (T--)
20     {
21         scanf("%d%d",&n,&m);
22         memset(vis,0,sizeof(vis));
23         memset(ac,0,sizeof(ac));
24         memset(f,0,sizeof(f));
25         ans=sum=0;
26         for (i=1;i<=m;i++)
27         {
28             scanf("%d%s%s",&x,s,t);
29             pro[i].x=x-1000;
30             pro[i].p=(s[1]-'0')*60+(s[3]-'0')*10+s[4]-'0';
31             pro[i].AC=(t[0]=='A');
32             if (!f[pro[i].x] && pro[i].AC)
33               f[pro[i].x]=1;
34         }
35         std::sort(pro+1,pro+m+1,cmp);
36         for (i=1;i<=m;i++)
37         {
38             if (ac[pro[i].x] || !f[pro[i].x]) continue;
39             if (!vis[pro[i].x]) sum++,vis[pro[i].x]=1;
40             if (pro[i].AC) ans+=pro[i].p,ac[pro[i].x]=1;
41             else ans+=20;
42         }
43         printf("%d %d
",sum,ans);
44     }
45     return 0;
46 }  
原文地址:https://www.cnblogs.com/rabbit1103/p/13811826.html