Task A3 PAT考試排名彙總

YunC發表於2024-11-28

【題目描述】 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函式,以及結構體的運用,邏輯簡單。

  1. 定義學生結構體,有id,成績,考點排名,總排名,考點編號等;
  2. 處理每個考點的資料,對每個考點的考生資訊儲存在一個區域性變數中,進行按成績降序,按考號升序進行排序,然後計算每個考點在改考點內的排名;
  3. 將所有考點的資料合併到一個全域性變數中;
  4. 對所有考點的資料進行一起全域性排序,以確定最終排名;
  5. 輸出結果,每個考生的資訊,考號,最終排名,考點編號,以及在該考點的排名。

關於sort函式和vetctor容器的用法可以檢視菜鳥教程:https://www.runoob.com/cplusplus/cpp-libs-algorithm.htmlhttps://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;
} 


相關文章