趣味编程大赛
时间: 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;
}
题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。