比赛计分问题

问题描述

      在 ACM/ICPC 地区赛中,参赛队可以直接提交题目答案,但若答案错误,则再次提交时最后的成绩会受到影响。比赛的测试系统对每次提交的程序进行评判,结果是 AC 或者某种错误,参赛队能看到这个结果。

      为了奖励优秀的队伍同时确定进军世界总决赛的资格名单,当两个队伍做出的题目数量相同时,会按照其使用的时间来进行进一步的排名。时间有两个部分,第一是总的解题时间,二是惩罚时间。所谓惩罚时间是指提交程序未通过时被罚的时间,每一次未通过的提交,都会在最终用于排名的时间中增加 20 分钟。对于没解决的题目不计时。

你的程序将读入一张运行结果清单,然后打印出前三名的成绩。

输入

输入文件包含若干测试数据集。

每个测试数据由两个部分组成,第一部分包含了一个正整数,它表示参赛队伍的个数。接下来的几行是每次提交的结果。每行表示一次提交的结果,包括提交时间、队伍编号、问题编号和裁定结果。

当一行中提交时间一项为 0 时,则表示当前的数据集结束。当参赛队伍的个数为 0 时,则表示全部输入的结束。

每个测试集中队伍的个数不超过 100 个,提交的次数不超过 10000 次。

输出

针对每一组输入,输出前三名的比分,包括队号、做出题数、比赛用时、名次。在输出排名前,要输出“case n”,其中 n 表示当前是第几组输入。

假设:可能有好几队在同一名次。比如如果有几队都是第三名,则将他们全部输出;如果有两队是第二名,则没有第三名。当队伍名次相同时,按照队伍编号从小到大输出。


测试输入关于“测试输入”的帮助 期待的输出关于“期待的输出”的帮助 时间限制关于“时间限制”的帮助 内存限制关于“内存限制”的帮助 额外进程关于“{$a} 个额外进程”的帮助
测试用例 1 以文本方式显示
  1. 3↵
  2. 12 1 2 yes↵
  3. 14 3 2 no↵
  4. 25 3 1 yes↵
  5. 29 1 1 no↵
  6. 38 3 2 yes↵
  7. 39 2 1 no↵
  8. 45 1 1 no↵
  9. 0↵
  10. 0↵
以文本方式显示
  1. case 1:↵
  2. 3 2 83 1↵
  3. 1 1 12 2↵
  4. 2 0 0 3↵
1秒 1024KB 0

题解思路

ACM比赛规则:

      比赛期间,每队使用1台电脑需要在5个小时内使用C、C++、Pascal或Java中的一种编写程序解决7到11个问题。程序完成之后提交裁判运行,运行的结果会判定为正确或错误两种并及时通知参赛队。而且有趣的是每队在正确完成一题后,组织者将在其位置上升起一只代表该题颜色的气球。最后的获胜者为正确解答题目最多且总用时最少的队伍。每道试题用时将从竞赛开始到试题解答被判定为正确为止,其间每一次提交运行结果被判错误的话将被加罚20分钟时间,未正确解答的试题不记时。

      基于题目中的叙述和ACM中的比赛规则,我感觉AC之后WA,AC之后又AC这两种情况是不会出现的,因为比赛中没有challenge这一项,如果题目过了就是过了,没有必要再次提交,对于比赛的队伍来说这样的做法是不可理解的。

整体思路:

对每个队伍的所有信息进行统计,然后利用排序进行输出,注意中间时间的记录和最后的输出。

具体实现:

利用结构体将一个队伍的所有信息存储在里面,在输入的时候就进行判断,对结构体中的时间和AC题数进行更新,然后排完序之后就输出。注意输出的时候一共有8中可能的输出情况:111#122#123#113#111111111。。。#11333333。。。#12222222。。。#12333333。。。一共有这么多种,所以输出的时候需要进行适当的判断。


实现代码


<span style="font-family:Microsoft YaHei;font-size:14px;">#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct node
	{
		int tishu;
		int time;
		int timu[200];
		int bianhao;
	}duiwu[105];
	
int cmp(const void *a,const void *b)
{
	if(((struct node *)a)->tishu !=( (struct node *)b)->tishu)
		return(((struct node *)b)->tishu - ((struct node *)a)->tishu);   //降序 
	else if(((struct node *)a)->time !=( (struct node *)b)->time)
		return(((struct node *)a)->time - ((struct node *)b)->time);
	else
		return(((struct node *)a)->bianhao - ((struct node *)b)->bianhao);
}	
	
	
/*int cmp( const void *a , const void *b )
{
	struct NODE *c = (NODE *)a;
	struct NODE *d = (NODE *)b;
if(c->tishu != d->tishu) 
{
	return d->tishu - c->tishu;       //题数降序排 
}
else if(c->time!=d->time)
{
	return c->time - d->time;	      //时间升序排 
}
else
{
	return c->bianhao-d->bianhao;
}
}*/

int main()
{
	
	int n,i,j,k=0;
	int dbian,wbian,t;
	char result[6];
	
	while(1)
	{
		scanf("%d",&n);
		if(n==0)
		{
			break;
		}
		else
		{
			for(i=0;i<n+3;i++)
			{
				duiwu[i].bianhao=0;
				duiwu[i].time=0;
				duiwu[i].tishu=0;
				for(j=0;j<200;j++)
				{
					duiwu[i].timu[j]=0;
				}
			}
			duiwu[0].bianhao=105;
			k++;
			printf("case %d:\n",k);	
			while(1)
			{
				scanf("%d",&t);
				if(t==0)
				{
					break;
				}
				else
				{
		        	scanf("%d%d%s",&dbian,&wbian,result);
					duiwu[dbian].bianhao=dbian;
					if(strcmp(result,"yes")==0)
					{
						duiwu[dbian].tishu++;
						duiwu[dbian].time+=t;
						duiwu[dbian].time+=20*duiwu[dbian].timu[wbian];
					}
					else
					{
						duiwu[dbian].timu[wbian]++;
					}
				}
			}
		qsort(duiwu,n+1,sizeof(struct node),cmp); 
		
		if(duiwu[2].tishu==duiwu[3].tishu&&duiwu[2].time==duiwu[3].time)
		{
			if(duiwu[0].tishu==duiwu[1].tishu&&duiwu[0].time==duiwu[1].time)
			{
				if(duiwu[1].tishu==duiwu[2].tishu&&duiwu[1].time==duiwu[2].time)   //111111111
				{
					for(j=0;j<n;j++)
					{
						if(duiwu[j].tishu!=duiwu[0].tishu||duiwu[j].time!=duiwu[0].time)
						{
							break;
						}
						else
						{
							printf("%d %d %d 1\n",duiwu[j].bianhao,duiwu[j].tishu,duiwu[j].time);	
						}
					}
				}
				else          //1133333
				{
					printf("%d %d %d 1\n",duiwu[0].bianhao,duiwu[0].tishu,duiwu[0].time);
					printf("%d %d %d 1\n",duiwu[1].bianhao,duiwu[1].tishu,duiwu[1].time);
					for(j=2;j<n;j++)
					{
						if(duiwu[j].tishu!=duiwu[2].tishu||duiwu[j].time!=duiwu[2].time)
						{
							break;
						}
						else
						{
							printf("%d %d %d 3\n",duiwu[j].bianhao,duiwu[j].tishu,duiwu[j].time);	
						}	
					}	
				}
			}
			else
			{
				if(duiwu[2].tishu==duiwu[1].tishu&&duiwu[2].time==duiwu[1].time)       //1222222
				{
						printf("%d %d %d 1\n",duiwu[0].bianhao,duiwu[0].tishu,duiwu[0].time);
						for(j=1;j<n;j++)
						{
							if(duiwu[j].tishu!=duiwu[1].tishu||duiwu[j].time!=duiwu[1].time)
							{
								break;
							}
							else
							{
								printf("%d %d %d 2\n",duiwu[j].bianhao,duiwu[j].tishu,duiwu[j].time);	
							}	
						}	
				}
				else          //1233333
				{
						printf("%d %d %d 1\n",duiwu[0].bianhao,duiwu[0].tishu,duiwu[0].time);
						printf("%d %d %d 2\n",duiwu[1].bianhao,duiwu[1].tishu,duiwu[1].time);
						for(j=2;j<n;j++)
						{
							if(duiwu[j].tishu!=duiwu[2].tishu||duiwu[j].time!=duiwu[2].time)
							{
								break;
							}
							else
							{
								printf("%d %d %d 3\n",duiwu[j].bianhao,duiwu[j].tishu,duiwu[j].time);	
							}	
						}	
				}
			}
		}
		else
		{
			if(duiwu[0].tishu==duiwu[1].tishu&&duiwu[0].time==duiwu[1].time)
			{
				if(duiwu[1].tishu==duiwu[2].tishu&&duiwu[1].time==duiwu[2].time)    //111
				{
					printf("%d %d %d 1\n",duiwu[0].bianhao,duiwu[0].tishu,duiwu[0].time);
					printf("%d %d %d 1\n",duiwu[1].bianhao,duiwu[1].tishu,duiwu[1].time);
					printf("%d %d %d 1\n",duiwu[2].bianhao,duiwu[2].tishu,duiwu[2].time);
				}
				else     //113
				{
					printf("%d %d %d 1\n",duiwu[0].bianhao,duiwu[0].tishu,duiwu[0].time);
					printf("%d %d %d 1\n",duiwu[1].bianhao,duiwu[1].tishu,duiwu[1].time);
					printf("%d %d %d 3\n",duiwu[2].bianhao,duiwu[2].tishu,duiwu[2].time);	
				}
			}
			else
			{
				if(duiwu[1].tishu==duiwu[2].tishu&&duiwu[1].time==duiwu[2].time)    //122
				{
					printf("%d %d %d 1\n",duiwu[0].bianhao,duiwu[0].tishu,duiwu[0].time);
					printf("%d %d %d 2\n",duiwu[1].bianhao,duiwu[1].tishu,duiwu[1].time);
					printf("%d %d %d 2\n",duiwu[2].bianhao,duiwu[2].tishu,duiwu[2].time);
				}
				else     //123
				{
					printf("%d %d %d 1\n",duiwu[0].bianhao,duiwu[0].tishu,duiwu[0].time);
					printf("%d %d %d 2\n",duiwu[1].bianhao,duiwu[1].tishu,duiwu[1].time);
					printf("%d %d %d 3\n",duiwu[2].bianhao,duiwu[2].tishu,duiwu[2].time);	
				}
			}
		}
		}
    }
    return 0;
}</span>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值