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


	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章