【題目描述】 PTA(資料結構與演算法題目集 7-41)
計算機程式設計能力考試(Programming Ability Test,簡稱 PAT)旨在透過統一組織的線上考試及
自動評測方法客觀地評判考生的演算法設計與程式設計實現能力,科學的評價計算機程式設計人才,
為企業選拔人才提供參考標準。 每次考試會在若干個不同的考點同時舉行,每個考點用區域網,產
生本考點的成績。考試結束後,各個考點的成績將即刻彙總成一張總的排名表。現在就請你寫一個
程式自動歸併各個考點的成績並生成總排名表。
【輸入格式】
輸入的第一行給出一個正整數 N(≤100),代表考點總數。隨後給出 N 個考點的成績,格式為:首
先一行給出正整數 K(≤300),代表該考點的考生總數;隨後 K 行,每行給出 1 個考生的資訊,包
括考號(由 13 位整數字組成)和得分(為[0,100]區間內的整數),中間用空格分隔。
【輸出格式】
首先在第一行裡輸出考生總數。隨後輸出彙總的排名表,每個考生的資訊佔一行,順序為:考號、
最終排名、考點編號、在該考點的排名。其中考點按輸入給出的順序從 1 到 N 編號。考生的輸出須
按最終排名的非遞減順序輸出,獲得相同分數的考生應有相同名次,並按考號的遞增順序輸出。
【輸入樣例】
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
本題運用到了algorithm裡的sort函式,以及結構體的運用,邏輯簡單。
- 定義學生結構體,有id,成績,考點排名,總排名,考點編號等;
- 處理每個考點的資料,對每個考點的考生資訊儲存在一個區域性變數中,進行按成績降序,按考號升序進行排序,然後計算每個考點在改考點內的排名;
- 將所有考點的資料合併到一個全域性變數中;
- 對所有考點的資料進行一起全域性排序,以確定最終排名;
- 輸出結果,每個考生的資訊,考號,最終排名,考點編號,以及在該考點的排名。
關於sort函式和vetctor容器的用法可以檢視菜鳥教程:https://www.runoob.com/cplusplus/cpp-libs-algorithm.html 和 https://www.runoob.com/cplusplus/cpp-vector.html。
下面是完整的程式碼:
# include<iostream>
# include<vector>
# include<algorithm>
using namespace std;
struct Student{
long long id; //考生號
int score; //考生成績
int Rank; //考生在本考場的排名
int index; //考點編號
};
//sort函式中的比較函式
bool CB_ScoreAndId(const Student &a, const Student &b)
{
if(a.score != b.score) return a.score > b.score; //按成績降序排列
return a.id < b.id; //如果成績相同,按考號升序排序
}
int main(){
//考點總數
int N;
cin >> N;
//學生的總人數
vector<Student> students;
//對每個考點遍歷
for(int i = 0; i < N; i++){
//每個考點的總人數
int number;
cin >> number;
//每個考點的學生
vector<Student> testStudent(number);
for(int j = 0; j < number; j++)
{
cin >> testStudent[j].id >> testStudent[j].score; //輸入每個考生的考生號以及成績
testStudent[j].index = i + 1; //每個考生的考點編號
}
//開始對每個考點的學生排序操作
sort(testStudent.begin(), testStudent.end(), CB_ScoreAndId);
//計算每個學生在當前考點的排名
int rank = 1;
for(int j = 0; j < number; j++ )
{
if(j > 0 && testStudent[j].score < testStudent[j-1].score)
{
rank = j + 1; //分數不同則排名遞增
}
testStudent[j].Rank = rank;
}
//將當前考點的學生加入到學生總列表
students.insert(students.begin(),testStudent.begin(), testStudent.end());
}
//對所有考點的學生排序
sort(students.begin(), students.end(), CB_ScoreAndId);
//輸出考點總數
cout << students.size() << endl;
//輸出每個學生的詳細資訊
int overRank = 1; //最終排名
for(size_t i = 0; i < students.size(); i++)
{
if(i > 0 && students[i].score < students[i-1].score)
{
overRank = i+1;
}
cout << students[i].id << " " << overRank << " " << students[i].index << " " << students[i].Rank <<endl;
}
system("pause");
return 0;
}