趣味编程大赛

时间: 1ms        内存:128M

描述:

猫猫学长带着今年的预备队员参加了sdibt大学第五届趣味编程大赛,本次比赛共有九道题,编号依次为A、B、C、D、E、F、G、H和I。
比赛按照每人的做题数目和累计罚时进行综合排名。
(1)做题数目多的排名高于做题数目少的;
(2)在做题数目相同的情况下,按照罚时的累计时间进行排序,罚时时间越少排名越高。
        其中罚时按照如下规则计算:如果题目没有做对过,则该题目不累计入总罚时。否则按照该题目第一次做对的时间累计入总罚时,
        同时累计该题的做错次数,每错一次,增加20分钟罚时。例如,zhangzhentang 同学的提交记录如下:
    A                 B         C                D             E               F                G                  H               I
 00:07:27(-1) 0(-2) 00:56:56(-4) 0(-3) 01:15:41(-1) 01:36:17(-1) 02:24:10(-1) 01:50:05(0)   0(-4)
其中 A题提交的时间是00:07:27,该题错过一次。B题没有做对,但提交过两次错误……,该同学的累计罚时计算为:
00:07:27 + 1*20分钟 + 00:56:56 + 4*20分钟 + 01:15:41 + 1*20分钟 + 01:36:17+ 1*20分钟 + 02:24:10 + 1*20分钟 + 01:50:05
= 10:50:36 。累计做对题目数 6 道题。

输入:

n名同学的做题记录

输出:

n名同学的排名,以及罚时,如果题目正确数和罚时完全相同,则按照姓名的字典序排列。

示例输入:

Nick	A		B		C		D		E		F		G		H		I
linlin	00:07:21(-1)	0(0)		0(-3)		0(0)		00:41:17(0)	01:08:53(0)	02:29:25(-6)	03:17:39(-4)	0(0)
ningnin	00:10:24(-3)	0(-4)		01:35:09(-7)	01:56:45(-2)	02:23:43(0)	0(0)		0(-4)		03:03:43(0)	0(0)
feifei	00:06:58(-2)	0(0)		0(-6)		0(-6)		02:48:59(-9)	01:52:51(-4)	0(0)		02:18:42(0)	0(0)
qiqi	00:49:07(-6)	0(0)		0(-1)		0(0)		01:36:37(-2)	02:10:25(-1)	0(-2)		0(-4)		0(0)
xuanxua	00:12:56(-4)	0(-3)		0(-3)		01:16:41		0(0)		0(-1)		0(-4)		0(-2)		0(0)
juju	00:08:04(-2)	0(0)		01:13:06(-3)	0(0)		0(-1)		0(-3)		0(0)		0(0)		0(-2)
jiajia	00:06:12(-1)	0(-1)		0(0)		0(0)		01:47:21(-3)	0(-2)		0(-2)		0(0)		0(0)

示例输出:

Rank	Nick		Solve		Penalty
1	linlin		5		11:24:35
2	ningnin		5		13:09:44
3	feifei		4		12:07:30
4	qiqi		3		07:36:09
5	xuanxua		2		02:49:37
6	juju		2		03:01:10
7	jiajia		2		03:13:33

提示:

参考答案(内存最优[1124]):

#include<stdio.h>
#include<string.h>
#include<algorithm>
 
typedef struct node
{
    char nick[20];
    int solve;
    int time;
    node():solve(0),time(0){}
}member;
 
bool cmp(member a,member b)
{
    if(a.solve!=b.solve){
        return a.solve>b.solve;
    }else if(a.time!=b.time){
        return a.time<b.time;
    }else{
        return strcmp(a.nick,b.nick)<0;
    }
}
 
int main()
{
    //freopen("in1.txt","r",stdin);
    //freopen("out1.txt","w",stdout);
    int n=0;
    char mess[20];
    member m[20];
    while(~scanf("%s",mess)){
        if(n)strcpy(m[n].nick,mess);
        for(int j=1;j<10;j++){
            scanf("%s",mess);
            if(n&&strlen(mess)>5){
                m[n].solve++;
                m[n].time+=((mess[0]-'0')*10+(mess[1]-'0'))*3600;
                m[n].time+=((mess[3]-'0')*10+(mess[4]-'0'))*60;
                m[n].time+=(mess[6]-'0')*10+(mess[7]-'0');
                if(mess[9]=='-'){
                    int cnt=0;
                    for(int k=10;k<strlen(mess)-1;k++){
                        cnt*=10;
                        cnt+=mess[k]-'0';
                    }
                    m[n].time+=cnt*20*60;
                }
            }
        }
        n++;
    }
    std::sort(m+1,m+1+n,cmp);
    printf("Rank\tNick\t\tSolve\t\tPenalty\n");
    for(int i=1;i<n;i++){
        printf("%d\t%s\t\t%d\t\t%02d:%02d:%02d\n",i,m[i].nick,m[i].solve,m[i].time/60/60,m[i].time/60%60,m[i].time%60);
    }
    return 0;
}

参考答案(时间最优[3]):

#include<stdio.h>
#include<string.h>
#include<algorithm>
 
typedef struct node
{
    char nick[20];
    int solve;
    int time;
    node():solve(0),time(0){}
}member;
 
bool cmp(member a,member b)
{
    if(a.solve!=b.solve){
        return a.solve>b.solve;
    }else if(a.time!=b.time){
        return a.time<b.time;
    }else{
        return strcmp(a.nick,b.nick)<0;
    }
}
 
int main()
{
    //freopen("in1.txt","r",stdin);
    //freopen("out1.txt","w",stdout);
    int n=0;
    char mess[20];
    member m[20];
    while(~scanf("%s",mess)){
        if(n)strcpy(m[n].nick,mess);
        for(int j=1;j<10;j++){
            scanf("%s",mess);
            if(n&&strlen(mess)>5){
                m[n].solve++;
                m[n].time+=((mess[0]-'0')*10+(mess[1]-'0'))*3600;
                m[n].time+=((mess[3]-'0')*10+(mess[4]-'0'))*60;
                m[n].time+=(mess[6]-'0')*10+(mess[7]-'0');
                if(mess[9]=='-'){
                    int cnt=0;
                    for(int k=10;k<strlen(mess)-1;k++){
                        cnt*=10;
                        cnt+=mess[k]-'0';
                    }
                    m[n].time+=cnt*20*60;
                }
            }
        }
        n++;
    }
    std::sort(m+1,m+1+n,cmp);
    printf("Rank\tNick\t\tSolve\t\tPenalty\n");
    for(int i=1;i<n;i++){
        printf("%d\t%s\t\t%d\t\t%02d:%02d:%02d\n",i,m[i].nick,m[i].solve,m[i].time/60/60,m[i].time/60%60,m[i].time%60);
    }
    return 0;
}

题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。