PAT甲级 1080 Graduate Admission (30 分) (模拟)

题目链接:传送门

思路:用结构体存储数据,然后rnk记录当前学校招收的最低排名,选学生时如果一样就扩招。

代码:

#include <bits/stdc++.h>

using namespace std;

const int maxn = 4e4 + 5 , N = 105;


struct node {
	int fg , ge , gi , rank , id;
	vector <int> g;
	bool operator < (const node b) const {
		return fg > b.fg || (fg == b.fg && ge > b.ge);
	}
}ap[maxn];

int gs[N] , rnk[N];
vector <int> ans[N];

int main() {
	int n , m , k;
	ios::sync_with_stdio(0);
	cin >> n >> m >> k;
	memset(rnk ,0x7f , sizeof(rnk));
	for(int i = 0 ; i < m ; i++) {
		cin >> gs[i];
	}
	for(int i = 0 ; i < n ; i++) {
		int ge , gi;
		cin >> ap[i].ge >> ap[i].gi;
		ap[i].fg = ap[i].ge + ap[i].gi;
		ap[i].id = i;
		for(int j = 0 ; j < k ; j++) {
			int t;
			cin >> t;
			ap[i].g.push_back(t);
		}
	}
	sort(ap , ap + n);
	ap[0].rank = 1;
	for(int i = 1 ; i < n ; i++) {
		if(!(ap[i - 1] < ap[i]))ap[i].rank = ap[i - 1].rank;
		else ap[i].rank = i + 1;
	}
	for(int i = 0 ; i < n ; i++) {
		for(int j = 0 ; j < ap[i].g.size() ; j++) {
			int t = ap[i].g[j];
			int t1 = ap[i].id;
			if(gs[t] || rnk[t] == ap[i].rank) {
				rnk[t] = ap[i].rank;
				if(gs[t])gs[t]--;
				ans[t].push_back(t1);
				break;
			}
		}
	}
	for(int i = 0 ; i < m ; i++) {
		sort(ans[i].begin() , ans[i].end());
		for(int j = 0 ; j < ans[i].size() ; j++) {
			if(j > 0)cout << " ";
			cout << ans[i][j];
		}
		cout << "\n";
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_39475280/article/details/103299598
今日推荐