在 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;
}
}
}