PAT A1025ソート結果

タイトル

1025 PATランキング(25分)
プログラミング能力試験(PAT)は、浙江大学のコンピュータ科学技術大学が主催しています。各テストは、いくつかの場所で同時に実行することになっている、とranklistsは、試験後すぐにマージされます。今ではすべて正しくranklistsをマージし、最終順位を生成するプログラムを書くためにあなたの仕事です。

入力仕様:
各入力ファイルは、1つのテストケースが含まれています。各場合について、最初の行は、正の数N(≤100)、テスト位置の数を含んでいます。次いで、N ranklistsはそれぞれ正の整数K(≤300)、被験者の数を含む行で始まり、登録番号(13桁の番号)と各被験者の総スコアを含む、次いでK線は、従います。行のすべての数字は、スペースで区切られます。

出力仕様:
各テストケース1つのライン被験者の総数の最初の印刷のために。そして、次の形式で最終ranklistを印刷します:

registration_number final_rank location_number local_rank

位置は、出力が最終ランクの順序を非減少でソートしなければならない1からNまで番号が付けられています。同じスコアを持つ被験者は、同じランクを持っている必要があり、出力はその登録番号の順番を非減少でソートする必要があります。

例O

サンプル入力:
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

ソリューション

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
struct Student  
{
	string id;
	int score;
	int locationNum;
	int locationRank;
	int finalRank;
}stu[30010];
bool cmp(Student a, Student b) {
	if (a.score != b.score) return a.score > b.score;
	else return a.id<b.id;
}
int main() {
	int N_location;
	int k;
	int num = 0;//学生总数
	//cin >> location;
	scanf("%d", &N_location);
	for (int locationNumber = 1; locationNumber <= N_location; locationNumber++) {
		scanf("%d", &k);
		for (int j = 0; j <k; j++,num++) {
			//scanf("%s %d", stu[num].id,&stu[num].score);
			cin >> stu[num].id >> stu[num].score;
			stu[num].locationNum = locationNumber;
		}
		//location_Rank存入Student中
		sort(stu + num - k, stu + num, cmp);
		stu[num - k].locationRank = 1;
		for (int j = num - k + 1; j < num; j++) {
			if (stu[j].score == stu[j - 1].score) {
				stu[j].locationRank = stu[j - 1].locationRank;
			}
			else {
				//分数不同排名不同 分数相同排名相同但占用一个排位
				//locationRank为该考生前人数+1 
				stu[j].locationRank = j + 1 -( num - k);
			}
		}
	}//for
	printf("%d\n", num);
	sort(stu, stu + num, cmp);
	stu[0].finalRank = 1;
	for (int j = 1; j < num; j++) {
		if (stu[j].score == stu[j - 1].score) {
			stu[j].finalRank = stu[j - 1].finalRank;
		}
		else {
			stu[j].finalRank = j+1;
		}	
	}
	for (int j = 0; j < num; j++) {
		cout << stu[j].id << " " << stu[j].finalRank << " " << stu[j].locationNum << " " << stu[j].locationRank << endl;
	}
	
	return 0;
}
リリース3元の記事 ウォンの賞賛0 ビュー14

おすすめ

転載: blog.csdn.net/zhizhione/article/details/104054780