2019hbcpc D.榜单 (C语言-大作业)

题目描述:给定一场ACM比赛的题目数量和提交列表,请你打印输出最终榜单。榜单的格式见输出和样例。根据比赛规则,榜单有以下要求:每道题的通过罚时按照分钟计算。每次未通过提交增加20分钟罚时,输入数据保证每个队伍罚时均小于10000分钟。到比赛结束都没有通过的题目不计入该队伍的罚时。每队通过后的题目在榜单的题目栏中用“+”号显示。如果仅提交一次就通过了,则显示“+”。否则显示“+k”,k 为...
摘要由CSDN通过智能技术生成

题目描述:

给定一场ACM比赛的题目数量和提交列表,请你打印输出最终榜单。榜单的格式见输出和样例。
根据比赛规则,榜单有以下要求:

  1. 每道题的通过罚时按照分钟计算。每次未通过提交增加20分钟罚时,输入数据保证每个队伍罚时均小于10000分钟。到比赛结束都没有通过的题目不计入该队伍的罚时。
  2. 每队通过后的题目在榜单的题目栏中用“+”号显示。如果仅提交一次就通过了,则显示“+”。否则显示“+k”,k 为这个队伍对于这道题通过之前的总提交次数。输入数据保证 k 不大于 9。
  3. 每队提交但是未通过的题目在榜单的题目栏中用“-”号显示。如果仅提交一次,则显示“-”。否则显示“-k”,k 为这个队伍对于这道题的总提交次数。输入数据保证 k 不大于9。
  4. 每队没有提交的题目需要在榜单的该队的题目栏留空。
  5. 题目提交状态为“Compile Error”的提交不计入榜单。
  6. 对于某个队伍,在通过某个题目后再次提交该题目,则通过后的提交不计入榜单。
  7. 如果某个队伍没有提交,或者所有的提交均不计入榜单。则榜单上不显示该队伍。
  8. 题目提交状态为“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&#
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值