录取的问题。
先给各个成绩进行排序,然后给出排名。
排名相同的,可以超额。
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
#define MAX 110
using namespace std;
int n, m, k;
struct appNode {
int id;
int ge;
int gi;
int gfin;
int rank;
vector <int> choice;
};
vector <appNode> list;
int school[MAX];
bool cmp(appNode a1, appNode a2) {
if (a1.gfin != a2.gfin) {
return a1.gfin > a2.gfin;
}
else if (a1.gfin == a2.gfin && a1.ge != a2.ge) {
return a1.ge > a2.ge;
}
else
return a1.choice < a2.choice;
}
int main() {
cin >> n >> m >> k;
for (int i = 0; i < m; i++) {
cin >> school[i];
}
list.resize(n);
for (int i = 0; i < n; i++) {
scanf("%d%d", &list[i].ge, &list[i].gi);
list[i].id = i;
list[i].gfin = list[i].ge + list[i].gi;
int tchoice;
for (int j = 0; j < k; j++) {
scanf("%d", &tchoice);
list[i].choice.push_back(tchoice);
}
}
sort(list.begin(), list.end(), cmp);
int NowRank = 1;
list[0].rank = NowRank;
int pre = 0;
for (int i = 1; i < list.size(); i++) {
if (list[pre].gfin == list[i].gfin && list[pre].ge == list[i].ge) {
list[i].rank = NowRank;
}
else {
list[i].rank = ++NowRank;
pre = i;
}
}
vector <appNode> FinApp[MAX];
vector <int> FinAns[MAX];
for (int i = 0; i < list.size(); i++) {
for (int j = 0; j < k; j++) {
int c = list[i].choice[j];
if (school[c] > 0) {//没录取满
FinApp[c].push_back(list[i]);
FinAns[c].push_back(list[i].id);
school[c]--;
break;
}
else {//满了
int last = FinApp[c].size() - 1;
if (FinApp[c][last].rank == list[i].rank) {//排名相同录取
FinApp[c].push_back(list[i]);
FinAns[c].push_back(list[i].id);
break;
}
}
}
}
for (int i = 0; i < m; i++) {
if (FinAns[i].size() != 0) {
sort(FinAns[i].begin(), FinAns[i].end());
cout << FinAns[i][0];
for (int j = 1; j < FinAns[i].size(); j++) {
cout << " " << FinAns[i][j];
}
cout << endl;
}
else
cout << endl;
}
return 0;
}