意外的不难,就是要求有点多
#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;
}