1. 程式人生 > >7-07. PAT排名彙總(25) (結構體 ZJU_PAT)

7-07. PAT排名彙總(25) (結構體 ZJU_PAT)

程式設計能力測試(Programming Ability Test,簡稱PAT)是浙江大學電腦科學與技術學院主辦的專業技術認證考試(網址http://pat.zju.edu.cn/)。每次考試會在若干個不同的考點同時舉行,每個考點用區域網,產生本考點的成績。考試結束後,各個考點的成績將即刻彙總成一張總的排名表。現在就請你寫一個程式自動歸併各個考點的成績並生成總排名表。

輸入格式說明:

輸入的第1行給出1個正整數N(<=100),代表考點總數。隨後給出N個考點的成績,格式為:首先1行給出正整數K(<=300),代表該考點的考生總數;隨後K行,每行給出1個考生的資訊,包括考號(由13位整數字組成)和得分(為[0,100]區間內的整數),中間用空格分隔。

輸出格式說明:

首先在第1行裡輸出考生總數。隨後輸出彙總的排名表,每個考生的資訊佔一行,順序為:考號、最終排名、考點編號、在該考點的排名。其中考點按輸入給出的順序從1到N編號。考生的輸出須按最終排名的非遞減順序輸出,獲得相同分數的考生應有相同名次,並按考號的遞增順序輸出。

樣例輸入與輸出:

序號 輸入 輸出
1
2
5
1234567890001 95
1234567890005 100
1234567890003 95
1234567890002 77
1234567890004 85
4
1234567890013 65
1234567890011 25
1234567890014 100
1234567890012 85
9
1234567890005 1 1 1
1234567890014 1 2 1
1234567890001 3 1 2
1234567890003 3 1 2
1234567890004 5 1 4
1234567890012 5 2 2
1234567890002 7 1 5
1234567890013 8 2 3
1234567890011 9 2 4
2
4
10
4000000000011 100
4000000000008 90
4000000000005 100
4000000000001 90
4000000000003 95
4000000000009 80
4000000000006 90
4000000000007 100
4000000000002 90
4000000000004 90
6
3000000000003 75
3000000000013 85
3000000000007 86
3000000000009 92
3000000000010 98
3000000000020 60
2
2000000000002 98
2000000000003 98
1
1000000000001 100
19
1000000000001 1 4 1
4000000000005 1 1 1
4000000000007 1 1 1
4000000000011 1 1 1
2000000000002 5 3 1
2000000000003 5 3 1
3000000000010 5 2 1
4000000000003 8 1 4
3000000000009 9 2 2
4000000000001 10 1 5
4000000000002 10 1 5
4000000000004 10 1 5
4000000000006 10 1 5
4000000000008 10 1 5
3000000000007 15 2 3
3000000000013 16 2 4
4000000000009 17 1 10
3000000000003 18 2 5
3000000000020 19 2 6
3
1
1
9999999999999 0
1
9999999999999 1 1 1

PS:

就是一道結構體運用的果題!

程式碼如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn = 41700;
struct ss
{
	char num[17];
	int s;
	int rank;//在當前考點的排名
	int mark;//在幾號考點
	int flag;//總排名
}stu[maxn];
bool cmp1(ss a, ss b)
{
	if(a.s == b.s)
	{
		return strcmp(a.num, b.num) < 0;
	}
	return a.s > b.s;
}
int main()
{
	int N;
	int k[117];
	int sum = 0;
	scanf("%d",&N);
	{
		int i, j;
		int l = 0, p = 0;
		for(i = 1; i <= N; i++)
		{
			scanf("%d",&k[i]);
			sum += k[i];
			int tt = l;
			for(j = 1; j <= k[i]; j++)
			{
				scanf("%s%d",stu[l].num,&stu[l].s);
				stu[l].mark = i;
				l++;
			}
			sort(stu+tt,stu+l,cmp1);
			p = 2;
			stu[tt].rank = 1;
			for(int h = tt+1; h < l; h++)
			{
				if(stu[h-1].s == stu[h].s)
				{
					stu[h].rank = stu[h-1].rank;
				}
				else
				{
					stu[h].rank = p;
				}
				p++;
			}
		}
		sort(stu,stu+l,cmp1);
		int f = 1;
		int flag = 0;
		printf("%d\n",sum);
		stu[0].flag = 1;
		printf("%s %d %d %d\n",stu[0].num,stu[0].flag,stu[0].mark,stu[0].rank);
		p = 2;
		for(int h = 1; h < l; h++)
		{
			if(stu[h-1].s == stu[h].s)
			{
				stu[h].flag = stu[h-1].flag;
			}
			else
			{
				stu[h].flag = p;
			}
			p++;
		}
		for(i = 1; i < l; i++)
		{
			printf("%s %d ",stu[i].num,stu[i].flag);
			printf("%d %d\n",stu[i].mark,stu[i].rank);
		}
	}
	return 0;
}