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