タイトル
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;
}