题目链接:传送门
思路:用结构体存储数据,然后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;
}