• 【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 }  
  • 相关阅读:
    [转]Android Uri Intent 用法汇总
    [书目20120607]编写高质量代码:改善C#程序的157个建议
    [转]Android多媒体:实现图像的编辑和合成
    [转]Android IPC进程通信——Messager方式
    [转]Android中程序与Service交互的方式——交互方式
    [书目20120605]人力资源管理 余凯成
    [转]SurfaceView horizontal scrolling
    住房乃生活所需
    [转]android service 学习(上) 音乐播放
    [转]Android实现获取本机中所有图片
  • 原文地址:https://www.cnblogs.com/rabbit1103/p/13811826.html
Copyright © 2020-2023  润新知