acm罚时

作为一个ACMer,总是习惯于在比赛中或比赛结束后查看自己的排名(Standing),有细心的同学发现Penalty(罚时),在相同做题数下Penalty越小越好(真是个令人振奋的发现)。让我们看看Penatly的计算方法:每道试题用时将从竞赛开始到试题解答被判定为正确(AC)为止,其间每一次提交运行结果被判错误的话将被加罚20分钟时间,未正确解答的试题不记时。例如:A、B两队都正确完成两道题目,其中A队提交这两题的时间分别是比赛开始后1:00和2:45,B队为1:20和2:00,但B队有一题提交了2次。这样A队的Penalty为1:00+2:45=3:45而B队为1:20+2:00+0:20=3:40,所以B队因Penalty少而获胜。当然如果你AC了某道题后,之后这一题所有提交的代码都不算罚时和时间(有时我也这么无聊~)。恰逢北化周一晚的周赛,在九楼机房18:00-22:00,考验随之而来——现在需要你计算大家的Penalty,Penalty初始为00:00,相信作为北化的ACMer相信你一定可以的!
输入

输入包含多组数据,每组数据的第一行包含一个正整数N(1=<N<=20)表示此ACMer的提交次数,接下来的第2到N+1行表示每次提交的状态,由三个字段组成,第一个字段为一个整数A,表示当前的时间:hour:minutes(保证18=<hour<=22,0<=minutes<=60),第二个字段为一个大写字母(A~Z),表示题号,第三个字段表示OJ返回的状态,假设只可能是AC,WA,RE,TLE中的一种,均为大写
输出

输出这位ACMer的Penalty,每个测试数据占一行
样例输入
3
18:05 A RE
19:11 A AC
20:00 B WA
1
20:27 F AC
样例输出
01:31
02:2
#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;
int main(){
    char time[20][5],num[20],zhuangtai[20][3];
    int n,m,hour1,visited,min1,i,n1,k,p,hour[20],min[20],visit[20],compare,compare1,compare2;
     
    while(scanf("%d",&n)!=EOF){//输入时间数据个数
        i=0;
        visited=0;//判断该题出现AC时前面有没出现过
        hour1=0;//最终小时
        min1=0;//最终分钟
        n1=n;//准备输入时间个数
        k=0;//计算有效AC个数
        while(n--){
        scanf("%s %c %s",time[i],&num[i],zhuangtai[i]);
         
    //  printf("%s %c %s",time[i],num[i],zhuangtai[i]);
        hour[i]=time[i][0]-48;
    //printf("%d\n",hour[i]);
    //cout<<time[i][0]<<endl;
        hour[i]=10*hour[i]+(time[i][1]-48);
        hour[i]-=18;
        min[i]=time[i][3]-48;
        min[i]=10*min[i]+(time[i][4]-48);
    /// printf("%d %d\n",hour[i],min[i]);
        compare=zhuangtai[i][0];
     
        if(compare==65){//标记出AC所在的下标记录到一个数组中
        //printf("%d\n",compare);
            compare2=num[i];
    //      printf("%d\n",compare2);
            for( m=0;m<k;m++){
                compare1=num[visit[m]];
                 
                if(compare1==compare2)
                    visited++;
            }
            if(visited==0){
            visit[k]=i;
            k++;}
            visited=0;
         
            //  printf("%d\n",visit[k]);
            }
        //printf("%d %d\n",hour[i],min[i]);
        i++;
        }//while
    for(m=0;m<k;m++){
        for(p=0;p<visit[m];p++){
            if(num[p]==num[visit[m]] && p!=visit[m]){
                min[visit[m]]+=20;
            }
            if(min[visit[m]] > 59){
                hour[visit[m]]+=min[visit[m]]/60;
                min[visit[m]]=min[visit[m]]%60;
            }
        }   //for   
    }//forda
    for(m=0;m<k;m++){
        hour1+=hour[visit[m]];
        min1+=min[visit[m]];
    /*  if(hour[visit[m]]<10)
            printf("0");
        printf("%d:",hour[visit[m]]);
        if(min[visit[m]]<10)
            printf("0");
        printf("%d",min[visit[m]]);
        printf("\n");*/
    }
    if(min1>59){
        hour1+=min1/60;
        min1=min1%60;
    }
if(hour1<10)
            printf("0");
        printf("%d:",hour1);
        if(min1<10)
            printf("0");
        printf("%d",min1);
        printf("\n");
    }//while总
    return 0;
 
}
 

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值