问题描述
在 ACM/ICPC 地区赛中,参赛队可以直接提交题目答案,但若答案错误,则再次提交时最后的成绩会受到影响。比赛的测试系统对每次提交的程序进行评判,结果是 AC 或者某种错误,参赛队能看到这个结果。
为了奖励优秀的队伍同时确定进军世界总决赛的资格名单,当两个队伍做出的题目数量相同时,会按照其使用的时间来进行进一步的排名。时间有两个部分,第一是总的解题时间,二是惩罚时间。所谓惩罚时间是指提交程序未通过时被罚的时间,每一次未通过的提交,都会在最终用于排名的时间中增加 20 分钟。对于没解决的题目不计时。
你的程序将读入一张运行结果清单,然后打印出前三名的成绩。
输入
输入文件包含若干测试数据集。
每个测试数据由两个部分组成,第一部分包含了一个正整数,它表示参赛队伍的个数。接下来的几行是每次提交的结果。每行表示一次提交的结果,包括提交时间、队伍编号、问题编号和裁定结果。
当一行中提交时间一项为 0 时,则表示当前的数据集结束。当参赛队伍的个数为 0 时,则表示全部输入的结束。
每个测试集中队伍的个数不超过 100 个,提交的次数不超过 10000 次。
输出
针对每一组输入,输出前三名的比分,包括队号、做出题数、比赛用时、名次。在输出排名前,要输出“case n”,其中 n 表示当前是第几组输入。
假设:可能有好几队在同一名次。比如如果有几队都是第三名,则将他们全部输出;如果有两队是第二名,则没有第三名。当队伍名次相同时,按照队伍编号从小到大输出。
| 测试输入![]() | 期待的输出![]() | 时间限制![]() | 内存限制![]() | 额外进程![]() |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 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>