1. 程式人生 > >1025 PAT Ranking (25 分)(分組結構體排序)

1025 PAT Ranking (25 分)(分組結構體排序)

題目簡單,但是自己暴露了不少小問題。
有一個語法錯誤好坑,卡了好久。

for(int j = 0; j<k; j++){
			cin >> arr[++sum].id >> arr[sum].score;
			arr[sum].local = i;
		}

cin雖然是從前往後讀的單竟然不是從前往後執行的,找這個錯誤找了好久。

自己最開始竟然忘記了集合裡的元素不能直接修改。

還有在結構體內部過載一定要加const。題目根本水的不行,就是自己各種小錯誤。先練幾個題找找手感,馬上就得系統複習語法了。

#include <cstdio>
#include <iostream>
#include <set>
#include <stack> 
#include <algorithm>
#include <string>
#include <cstring>
using namespace std;

struct stu{
	string id;
	int score;
	int rank;
	int local;
	int local_rank;
	stu(string _id = "", int _score = 0, int _rank = 0, int _local = 0, int _local_rank = 0) : id(_id), score(_score), rank(_rank), local(_local), local_rank(_local_rank){	
	};
	
	bool operator < (const stu &b) const {
		if (score != b.score) return score > b.score;
		else return id < b.id;
	}
};

stu arr[50000];
stack<stu> local[200];
int sum = -1;


int n, k;

int main()
{
	cin >> n;
	
	for (int i = 1; i<=n; i++){
		cin >> k;
		for(int j = 0; j<k; j++){
			cin >> arr[sum].id >> arr[++sum].score;
			arr[sum].local = i;
		}
	}
	
	sort(arr, arr+sum+1);
	
	for (int i = 0; i<=sum; i++){
		if (i == 0){
			arr[i].rank = 1;
			arr[i].local_rank = 1;
			local[arr[i].local].push(arr[i]);
			continue; 
		}
		
		if (arr[i].score == arr[i-1].score){
			arr[i].rank = arr[i-1].rank;
		} else arr[i].rank = i+1;
		
		if (local[arr[i].local].empty()){
				arr[i].local_rank = 1;
				local[arr[i].local].push(arr[i]);
		}else{
				if (arr[i].score == local[arr[i].local].top().score){
					arr[i].local_rank = local[arr[i].local].top().local_rank;
					local[arr[i].local].push(arr[i]);
				}else{
					arr[i].local_rank = local[arr[i].local].size()+1;
					local[arr[i].local].push(arr[i]);
				}	
		}
	}
	
	cout << sum+1 << endl;
	for (int i = 0; i<=sum; i++){
		cout << arr[i].id << ' ' << arr[i].rank << ' ' << arr[i].local << ' ' << arr[i].local_rank << endl;
	}
	
	return 0;
}