1080 Graduate Admission (30 分)
思路有空更新
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct node{
int id, ge, gi, r, admit;
double avg;
int ch[10];
}a[40050];
int b[150];
vector<int> v[150];
bool cmp(node x, node y) {
if(x.avg != y.avg)
return x.avg > y.avg;
else
return x.ge > y.ge;
}
int main() {
int n, m, k;
cin >> n >> m >> k;
for(int i = 0; i < m; ++i)
cin >> b[i];
for(int i = 0; i < n; ++i){
cin >> a[i].ge >> a[i].gi;
for(int j = 0; j < k; ++j)
cin >> a[i].ch[j];
a[i].id = i, a[i].avg = (a[i].ge + a[i].gi) / 2.0;
}
sort(a, a + n, cmp);
for(int i = 0; i < n; ++i){
if(a[i].avg != a[i - 1].avg)
a[i].r = i;
else{
if(a[i].ge == a[i - 1].ge)
a[i].r = a[i - 1].r;
else
a[i].r = i;
}
for(int j = 0; j < k; ++j){
int c = a[i].ch[j];
if(b[c] > 0) {
a[i].admit = c;
v[c].push_back(a[i].id);
b[c]--;
break;
}
else {
int f = 0;
for(int t = i - 1; a[t].r == a[i].r && t >= 0; t--){
if(a[t].admit == c){
a[i].admit = c;
v[c].push_back(a[i].id);
f = 1; break;
}
}
if(f) break;
}
}
}
for(int i = 0; i < m; ++i){
sort(v[i].begin(), v[i].end());
for(int j = 0; j < v[i].size(); ++j)
cout << v[i][j] << " \n"[j == v[i].size() - 1];
if(v[i].size() == 0) printf("\n");
}
}