在 ACM/ICPC 地區賽中,參賽隊可以直接提交題目答案,但若答案錯誤,則再次提交時最後的成績會受到影響。比賽的測試系統對每次提交的程序進行評判,結果是 AC 或者某種錯誤,參賽隊能看到這個結果。
爲了獎勵優秀的隊伍同時確定進軍世界總決賽的資格名單,當兩個隊伍做出的題目數量相同時,會按照其使用的時間來進行進一步的排名。時間有兩個部分,第一是總的解題時間,二是懲罰時間。所謂懲罰時間是指提交程序未通過時被罰的時間,每一次未通過的提交,都會在最終用於排名的時間中增加 20 分鐘。對於沒解決的題目不計時。
你的程序將讀入一張運行結果清單,然後打印出前三名的成績。
輸入
輸入文件包含若干測試數據集。
每個測試數據由兩個部分組成,第一部分包含了一個正整數,它表示參賽隊伍的個數。接下來的幾行是每次提交的結果。每行表示一次提交的結果,包括提交時間、隊伍編號、問題編號和裁定結果。
當一行中提交時間一項爲 0 時,則表示當前的數據集結束。當參賽隊伍的個數爲 0 時,則表示全部輸入的結束。
每個測試集中隊伍的個數不超過 100 個,提交的次數不超過 10000 次。
輸出
針對每一組輸入,輸出前三名的比分,包括隊號、做出題數、比賽用時、名次。在輸出排名前,要輸出“case n”,其中 n 表示當前是第幾組輸入。
假設:可能有好幾隊在同一名次。比如如果有幾隊都是第三名,則將他們全部輸出;如果有兩隊是第二名,則沒有第三名。當隊伍名次相同時,按照隊伍編號從小到大輸出。
測試輸入 | 期待的輸出 | 時間限制 | 內存限制 | 額外進程 | |
---|---|---|---|---|---|
測試用例 1 |
以文本方式顯示
|
以文本方式顯示
|
1秒 | 1024KB | 0 |
#include<stdio.h>
#include<string.h>
#include<math.h>
struct node{
int a, b, c, d[15];
}sco[105];//a存隊伍號,b存總成績,c存做出的題,d每個題的罰時
char readin[10005][20];
int main()
{
int m, n;
n = 0;
while (1)
{
n++;
scanf("%d", &m);
// getchar();
if (m == 0)
break;
memset(readin, 0, sizeof(readin));
int j;
for (j = 1; j <= m; j++)
{
sco[j].a = j;
sco[j].b = 0;
sco[j].c = 0;
int k;
for (k = 0; k < 15; k++)
sco[j].d[k] = 0;
}
int i = 0;
while (1)
{
gets(readin[i]);
if (readin[i][0] == '0'&&readin[i][1] == '\0')
break;
int len,sco1=0, team=0, que=0;
len = strlen(readin[i]);
for (j = 0; j < len;j++)
if (readin[i][j] == ' ')
break;//現在j存的是空格
int t;
for (t = 0; t < j; t++)
sco1 += pow(10.0, j - 1 - t)*(readin[i][t]-'0');
for (t = j + 1; t < len;t++)
if (readin[i][t] == ' ')
break;//現在t存的是空格
for (j = j+1; j < t; j++)
team += pow(10.0, t - 1 - j)*(readin[i][j] - '0');
for (j = t + 1; j < len;j++)
if (readin[i][j] == ' ')
break;
for (t = t+1; t < j; t++)
que += pow(10.0, j - 1 - t)*(readin[i][t] - '0');
if (readin[i][j + 1] == 'y')
{
sco[team].b += sco1 + sco[team].d[que];
sco[team].c++;
}
else
sco[team].d[que] += 20;
i++;
}//字符串做法
/* int sco1 = 0, team = 0, que = 0;
char ac[5];
scanf("%d", &sco1);
while (sco1 != 0)
{
scanf("%d%d%s", &team, &que, &ac);
if (ac[0] == 'y')
{
sco[team].b += sco1 + sco[team].d[que];
sco[team].c++;
}
else
sco[team].d[que] += 20;
scanf("%d", &sco1);
}//數字做法*/
for (i = 1; i <= m;i++)
for (j = 1; j<=m - i;j++)
if (sco[j + 1].c>sco[j].c)
{
int tmp;
tmp = sco[j].a;
sco[j].a = sco[j + 1].a;
sco[j + 1].a = tmp;
tmp = sco[j].b;
sco[j].b = sco[j + 1].b;
sco[j + 1].b = tmp;
tmp = sco[j].c;
sco[j].c = sco[j + 1].c;
sco[j + 1].c = tmp;
}
else if (sco[j + 1].c == sco[j].c)
{
if (sco[j + 1].b < sco[j].b)
{
int tmp;
tmp = sco[j].a;
sco[j].a = sco[j + 1].a;
sco[j + 1].a = tmp;
tmp = sco[j].b;
sco[j].b = sco[j + 1].b;
sco[j + 1].b = tmp;
tmp = sco[j].c;
sco[j].c = sco[j + 1].c;
sco[j + 1].c = tmp;
}
else if (sco[j + 1].b == sco[j].b)
if (sco[j + 1].a<sco[j].a)
{
int tmp;
tmp = sco[j].a;
sco[j].a = sco[j + 1].a;
sco[j + 1].a = tmp;
tmp = sco[j].b;
sco[j].b = sco[j + 1].b;
sco[j + 1].b = tmp;
tmp = sco[j].c;
sco[j].c = sco[j + 1].c;
sco[j + 1].c = tmp;
}
}
printf("case %d:\n", n);
int tmp=1;
int maxe = 4;
if (m < 3)
maxe = m + 1;
for (i = 1; i < maxe; i++)
{
printf("%d %d %d %d\n", sco[i].a,sco[i].c,sco[i].b,tmp);
while (i < m&&sco[i].b == sco[i + 1].b && sco[i].c == sco[i + 1].c)
{
i++;
printf("%d %d %d %d\n", sco[i].a, sco[i].c, sco[i].b, tmp);
}
tmp = i+1;
}
}
return 0;
}