1025 PAT Ranking (25 分)(分组结构体排序)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/NCUscienceZ/article/details/82959183

题目简单,但是自己暴露了不少小问题。
有一个语法错误好坑,卡了好久。

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;
}

猜你喜欢

转载自blog.csdn.net/NCUscienceZ/article/details/82959183