题目描述:
给定一场ACM比赛的题目数量和提交列表,请你打印输出最终榜单。榜单的格式见输出和样例。
根据比赛规则,榜单有以下要求:
- 每道题的通过罚时按照分钟计算。每次未通过提交增加20分钟罚时,输入数据保证每个队伍罚时均小于10000分钟。到比赛结束都没有通过的题目不计入该队伍的罚时。
- 每队通过后的题目在榜单的题目栏中用“+”号显示。如果仅提交一次就通过了,则显示“+”。否则显示“+k”,k 为这个队伍对于这道题通过之前的总提交次数。输入数据保证 k 不大于 9。
- 每队提交但是未通过的题目在榜单的题目栏中用“-”号显示。如果仅提交一次,则显示“-”。否则显示“-k”,k 为这个队伍对于这道题的总提交次数。输入数据保证 k 不大于9。
- 每队没有提交的题目需要在榜单的该队的题目栏留空。
- 题目提交状态为“Compile Error”的提交不计入榜单。
- 对于某个队伍,在通过某个题目后再次提交该题目,则通过后的提交不计入榜单。
- 如果某个队伍没有提交,或者所有的提交均不计入榜单。则榜单上不显示该队伍。
- 题目提交状态为“Accepted”的提交表示本题正确通过,其它状态均表示未通过。
输入描述:
- 第一行一个数字 n(n≤14),表示这场比赛有 n 道题目,题目的标号从 A开始。
- 接下来若干行,每行格式形如:时间 题号 结果 队名,表示一条提交记录,提交记录按提交时间顺序排列。
- 其中,时间形如HH:MM,输入数据保证时间一定小于05:00。
- 题号为单独的一个大写字母。
- 结果属于集合 { Accepted, Wrong Answer, Time Limit Exceeded, Compile Error, Memory Limit Exceeded, Output Limit Exceeded, Runtime Error, Presentation Error }。
- 队名为一个含有空格、大写和小写字母的字符串,队名长度不超过 43。
- 输入以一行 “GAME OVER!” 结尾,表示比赛结束。
输出描述:
- 输出的榜单有 n+4栏,每栏之间间隔 2个空格。
- Rank一栏的宽度为 4个字符,表示该队伍的排名。
- Who一栏的宽度43个字符,表示该队伍的名字。
- Solved一栏宽度为 6个字符,显示每个队伍通过题目的数量。
- Penalty一栏宽度为 7个字符,按要求显示每队总用时(每题通过时间+有效的总罚时)。
- 接下来是题目栏,每个题目栏的宽度均为 3个字符,按要求显示“+”或“-”,表示每个队伍通过题目的情况。
- 每一栏的第一行为这一栏的名称,其中,Who需左对齐,其他栏需右对齐。
- 题目栏的名称为题目的标号。
- 接下来若干行,按顺序输出每个队伍的信息,每栏的信息需右对齐。
- 队伍按照通过题目数量排名,如果两队通过题目数量相等,总用时少的队伍排名靠前。
- 如果出现题数和罚时均相等的队伍,则按照队名的字典序排序,同时Rank一栏的值需相等。第一个与他们排名不相等的队伍的排名选择绝对排名,例如前五个队伍的排名分别为1、2、3、3、3,则第六个队伍的绝对排名为6。
样例输入:
4
00:01 B Wrong Answer University of Deep Dark Fantasy
00:01 B Accepted University of Deep Dark Fantasy
00:01 C Accepted University of Deep Dark Fantasy
00:01 D Accepted University of Deep Dark Fantasy
00:11 A Accepted Deep Dark Institude of Fantasy
00:13 C Wrong Answer Banana University
01:01 C Wrong Answer Banana University
01:11 C Wrong Answer Banana University
02:01 C Runtime Error Deep Dark Institude of Fantasy
02:10 C Accepted Deep Dark Institude of Fantasy
02:30 A Accepted University of Deep Dark Fantasy
02:50 D Accepted Bon Sha Ka La Ka Higher School of Economics
02:51 C Accepted Bon Sha Ka La Ka Higher School of Economics
02:52 B Accepted Bon Sha Ka La Ka Higher School of Economics
02:53 A Accepted Bon Sha Ka La Ka Higher School of Economics
02:55 A Runtime Error University Van Billy
02:59 B Compile Error University Van Banana
GAME OVER!
样例输出:
Rank Who Solved Penalty A B C D
1 University of Deep Dark Fantasy 4 173 + +1 + +
2 Bon Sha Ka La Ka Higher School of Economics 4 686 + + + +
3 Deep Dark Institude of Fantasy 2 161 + +1
4 Banana University 0 0 -3
4 University Van Billy 0 0 -1
提示:
- 字符串查找函数 strstr()
包含文件:string.h
函数原型:char * strstr(char *str1, char *str2);
-str1: 被查找目标 string expression to search.
-str2: 要查找对象 The string expression to find.
-返回值:若str2是str1的子串,则返回str2在str1的首次出现的地址;如果str2不是str1的子串,则返回NULL。
例子:
char str[] = "1234xyz";
char * p = strstr(str, "34");
puts(p); // 34xyz
- 读取完n值之后,可通过 getchar()来读取n后面的换行,保证后面通过gets()正常读取每一行内容。
C语言代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct sch//学校的结构体
{
char name[50];//校名
int solved;//解决的数目
int penalty;//总罚时
int protime[15];//每道题目的罚时
int protimes[15];//每道题目提交错误的次数
bool flag[15];//是否做出题目
int rank;//学校的名次
}sch;
sch arr[105];//用来存储学校
sch t;//排序时用到的
int main(void)
{
//所有的变量名
int n;//题目数
int m,s,time;//时间
char line[100],len;//一行数据,每行的长度
char pro;//提交的题号
int num=0;//已被记录的学校数目
int index;//学校在数组中的索引值
int i,j;//遍历用到的
char *p;//搜索字符串用到的
bool flag2;//用来标记当前学校是否被记录
int id;//排名时用到的
bool flag3;//判断学校是否通过题目时用到的
scanf("%d",&n);
getchar();//注意gets是吸收回车的,只需要加一个getchar即可
//while循环处理输入的学校信息
while(true)
{
flag2=0;//用来标记当前输入的学校是否被数组记录
gets(line);
if(line[0]=='G')//结束
break;
m=(line[0]-'0')*10+line[1]-'0';//分钟
s=(line[3]-'0')*10+line[4]-'0';//秒
time=60*m+s;//总时间
for(i=0;i<num;i++)//在已经收录的学校中寻找,判断当前学校有没有被收录
{
char *p = strstr(line,arr[i].name);//判断学校是否被记录
if(p!=NULL)//学校已被记录
{
flag2=1;//标记学校已被记录
index=i;//学校在数组中的索引值
break;
}
}
if(line[8]=='W'||line[8]=='T'||line[8]=='M'||line[8]=='O'||line[8]=='R'||line[8]=='P')//没有做对题目的情况
{
len=strlen(line);//每行的长度
pro=line[6];//提交的题号
if(!flag2)//学校没有被结构体数组记录
{
arr[num].protimes[pro-'A']++;;//错误提交的次数加1
arr[num].protime[pro-'A']+=20;//罚时加20
//记录学校的名字
if(line[8]=='W&#