猫猫学长带着今年的预备队员参加了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) 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)
样例输出 #1
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
代码如下:
#include<iostream>
#include<stdio.h>
#include<iomanip>
#include<string.h>
#include<algorithm>
using namespace std;
typedef struct node//建立学生结构体
{
char name[20];
int solve = 0;
int time = 0;
}stud;
bool cmp(stud a, stud 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.name, b.name) < 0;
}
int jisuan1(int sum)//从秒计算小时
{
int a;
a = sum / 3600;
return a;
}
int jisuan2(int sum)//从秒计算分钟
{
int b;
b = sum % 3600 / 60;
return b;
}
int jisuan3(int sum)//计算秒
{
int c;
c = sum % 3600 % 60;
return c;
}
int main()
{
int n = 1;
char str[20];
stud stu[20];
for (int i = 1; i <= 10; i++)//先输入题目标题A~I
scanf("%s", str);
while (~scanf("%s", str))
{
strcpy(stu[n].name, str);//输入名字
for (int j = 1; j < 10; j++)//每个题目
{
scanf("%s", str);//输入每个题目花费时间
if (strlen(str) > 5)//如果输入的花费的时间的字符长度大于5,也就是说明不是 0(-n)的形式,就说明这道题做出来了
{
stu[n].solve++;//那么该同学解决的问题数目就加一
stu[n].time += ((str[0] - '0') * 10 + (str[1] - '0')) * 3600;//字符串的第0位和第1位代表小时,给他换算成秒
stu[n].time += ((str[3] - '0') * 10 + (str[4] - '0')) * 60;//同理,分钟变成秒
stu[n].time += (str[6] - '0') * 10 + (str[7] - '0');//秒
if (str[9] == '-')//如果该同学做错过,那说明会有罚时
{
int num = 0;//记录十分位
for (int k = 10; k < strlen(str) - 1; k++)
{
num *= 10;
num += str[k] - '0';
}//最后求的num就是该同学做错该题的次数
stu[n].time += num * 20 * 60;//求得全部时间(秒)
}
}
}
n++;//下一位同学
}
sort(stu + 1, stu + 1 + n, cmp);//排序一下
printf("Rank\tNick\t\tSolve\t\tPenalty\n");//输出表头 ps:\t代表一个制表符
for (int i = 1; i < n; i++)//输出每个人的排名做题情况
printf("%d\t%s\t\t%d\t\t%02d:%02d:%02d\n", i, stu[i].name, stu[i].solve, jisuan1(stu[i].time), jisuan2(stu[i].time), jisuan3(stu[i].time));
return 0;
}