问题描述
输入格式
输出格式
样例输入
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 }