#pragma warning(disable:4996)
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
/*
题目总结:吐了,总会有这样那样的小问题
题目思路:对所有学生进行排序先,先按照grade,一样时,比较ge,仍一样,说明rank一样
在数组下标问题上浪费了大量的时间
再捋一遍顺序,对vector容器排序后,每个节点应该保存学号index,
从高往下,选学校,有两个条件,如果quota没满,直接进,满了,比较已录取学生的成绩,
如果和其中成绩最差的一样,加入
输出的时候,要按学号升序,之前加入的时候,因为要比较成绩,所以,加入的result中是按APP序号的,
加入到result结果中的应该是APP的序号,但是最后要输出学生的学号,
所以应该用结构体,一个保存APP序号,一个保存原本的学号,这里的APP序号相当于排名
主要就是要区分学号和排名的问题
*/
int app_num, sch_num, cho_num;
int quota[100];
struct node {
int stu_index;
int app_index;
node(int _s,int _a):stu_index(_s),app_index(_a){}
};
vector<node> result[100];
struct app {
int ge;
int gi;
double grade;
vector<int> choices;
int index;
};
vector<app> APP;
bool compare(int choice,int index) {
if (quota[choice] > 0)return true;
else {
int size = result[choice].size();
int flag = false;
for (int i = 0; i < size; i++) {
if (APP[result[choice][i].app_index].grade == APP[index].grade)
if (APP[result[choice][i].app_index].ge == APP[index].ge)
{
flag = true;
break;
}
}
return flag;
}
}
bool cmp1(app a1,app a2) {
if (a1.grade == a2.grade)
return a1.ge > a2.ge;
else return a1.grade > a2.grade;
}
bool cmp2(node a1, node a2) {
return a1.stu_index < a2.stu_index;
}
int main() {
int tem_cho, choice;
cin >> app_num >> sch_num >> cho_num;
for (int i = 0; i < sch_num;i++) {
cin >> quota[i];
}
app temp_app;
for (int i = 0; i < app_num; i++) {
temp_app.index = i;
cin >> temp_app.ge >> temp_app.gi;
temp_app.grade = 1.0*(temp_app.ge + temp_app.gi) / 2;
for (int j = 0; j < cho_num; j++) {
cin >> tem_cho;
temp_app.choices.push_back(tem_cho);
}
APP.push_back(temp_app);
temp_app.choices.clear();
}
sort(APP.begin(), APP.end(), cmp1);
for (int i = 0; i < app_num; i++) {
for (int j = 0; j < cho_num; j++) {
choice = APP[i].choices[j];
if (quota[choice] > 0 || compare(choice, i)) {
result[choice].push_back(node(APP[i].index,i));
quota[choice]--;
break;
}
}
}
for (int i = 0; i < sch_num; i++) {
int size = result[i].size();
if (size == 0)printf("\n");
else {
sort(result[i].begin(), result[i].end(), cmp2);
for (int j = 0; j < size; j++) {
printf("%d", result[i][j].stu_index);
if (j != size - 1)printf(" ");
else printf("\n");
}
}
}
system("pause");
return 0;
}