BIT2014级软件学院程序设计-14 比赛记分问题

 

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

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

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

输入

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

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

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

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

输出

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

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

Sample Input

3

10 3 2 no

10 1 2 yes

11 1 1 no

13 1 1 no

18 2 1 no

20 3 1 yes

20 1 1 yes

30 3 2 yes

0

0

Sample Output

case 1:

1 2 70 1

3 2 70 1

2 0 0 3


模拟然后排个序就行了,注意如果两个队都是第二名就没有第三名,反正细节注意一点就行。

#include<stdio.h>
#include<stdlib.h>
int n;
typedef struct {
	int ti, te;
	int pr;
	char re[4];
}NODE;
NODE a[10005];
int cmp_time(const void*a, const void*b)
{
	return ((NODE*)a)->ti - ((NODE*)b)->ti;
}
typedef struct {
	int tim, num,t;//t是第几个队伍
	int vis[1005];
}NODE2;
NODE2 b[200];
int cmp_ans(const void*a, const void*b)
{
	if ((*(NODE2*)b).num == (*(NODE2*)a).num)
	{
		if ((*(NODE2*)b).tim == (*(NODE2*)a).tim)
		{
			return (*(NODE2*)a).t - (*(NODE2*)b).t;
		}
		else  return (*(NODE2*)a).tim - (*(NODE2*)b).tim;
	}


	else return (*(NODE2*)b).num - (*(NODE2*)a).num;
}
int main()
{
	int tmp[200];//名次
	int wtf;//已经输出了几支队伍
	int pro,i, j, time, flag;
	int team;
	char  result[5];
	int length;
	int vvv[200][1000];flag = 0;
	while (scanf("%d", &n)!=EOF && n)
	{
		memset(vvv, 0, sizeof(vvv));
		memset(a, 0, sizeof(a));
		memset(b, 0, sizeof(b));
		memset(tmp, 0, sizeof(tmp));
		i = 0;
		flag++;
		while (scanf("%d", &time) != EOF&&time)
		{
			scanf("%d%d%s", &team, &pro,&result);
			a[i].ti = time;
			a[i].pr = pro;
			a[i].te = team;
			for (j = 0;j < 3;j++)
			a[i].re [j]= result[j];
			i++;

		}
		length = i;
		qsort(a, i, sizeof(NODE), cmp_time);
		for (i = 1;i <= n;i++)
			b[i].t = i;
		for (i = 0;i < length;i++)
		{
			time = a[i].ti;
			team = a[i].te;
			pro = a[i].pr;
			if (a[i].re[0] == 'y'&&!vvv[team][pro])
			{
				b[team].num++;
				b[team].tim += time;
				b[team].tim += 20 * b[team].vis[a[i].pr];
				vvv[team][pro] = 1;
			}
			if (a[i].re[0] == 'n'&&!vvv[team][pro])
			{
				b[team].vis[pro]++;
			}
		}
		qsort(b+1, n, sizeof(NODE2), cmp_ans);
		printf("case %d:\n", flag);
		wtf = 1;
		tmp[1] = 1;tmp[0] = 1;
		for (i = 1;i <= n;i++)
		{
			if(tmp[i]==tmp[i-1]||tmp[i]<=3)
			printf("%d %d %d %d\n",b[i].t,b[i].num,b[i].tim,tmp[i]);
			wtf++;
			if (b[i].tim == b[i + 1].tim&&b[i].num == b[i + 1].num)
			{
				tmp[i + 1] = tmp[i];
			}
			else tmp[i + 1] = wtf;
		}


	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值