PAT甲级 1080(C++)

意外的不难,就是要求有点多

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct stu {
	int no;
	float Ge, Gi, ave;
	int prefer[5];
	int rank;
};
int N, M, K;
vector<int>quota;
vector<stu>info;
vector<stu>result[100];
bool compare1(stu s1, stu s2) {
	if (s1.ave != s2.ave) return s1.ave > s2.ave;
	if(s1.Ge!=s2.Ge) return s1.Ge > s2.Ge;
	return s1.no < s2.no;
}
bool compare2(stu s1, stu s2) {
	return s1.no < s2.no;
}
int main() {
	cin >> N >> M >> K;
	quota.resize(M);
	info.resize(N);
	for (int i = 0; i < M; i++) cin >> quota[i];
	for (int i = 0; i < N; i++) {
		info[i].no = i;
		cin >> info[i].Ge >> info[i].Gi;
		info[i].ave = (info[i].Ge + info[i].Gi) / 2;
		for (int j = 0; j < K; j++)
			cin >> info[i].prefer[j];
	}
	sort(info.begin(), info.end(), compare1);
	for (int i = 0; i < N; i++) {
		if (i == 0) info[i].rank = 1;
		else if (info[i].ave == info[i - 1].ave && info[i].Ge == info[i - 1].Ge)
			info[i].rank = info[i - 1].rank;
		else info[i].rank = i + 1;
		for (int j = 0; j < K; j++) {
			int p = info[i].prefer[j];
			if (result[p].size() < quota[p]) {
				result[p].push_back(info[i]);
				break;
			}
			else if(result[p].size()!=0){
				if(result[p].back().rank == info[i].rank){
				result[p].push_back(info[i]);
				break;
				}
			}
		}
	}
	for (int i = 0; i < M; i++) {
		sort(result[i].begin(), result[i].end(), compare2);
		for (int j = 0; j < result[i].size(); j++) {
			cout << result[i][j].no;
			if (j != result[i].size() - 1) cout << " ";
		}
		cout << endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45681165/article/details/121164132