emmm好久没来写过了,写了一个思路比较清晰的解法,仅供参考
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn = 4e4 + 10;
const int maxm = 110;
const int maxk = 5;
struct stu {
int id;
int ge, gi, fg;
int choice[maxk];
bool operator<(const stu&x)const
{
return fg == x.fg ? ge > x.ge: fg > x.fg;
}
}student[maxn];
struct sch {
int quota;
int last_fg, last_ge;
vector<int> admit;
}school[maxm];
int n, m, k;
int main()
{
scanf("%d%d%d", &n, &m, &k);
for (int i = 0; i < m; i++)scanf("%d", &school[i].quota);
for (int i = 0; i < n; i++)
{
student[i].id = i;
scanf("%d%d", &student[i].ge, &student[i].gi);
student[i].fg = student[i].ge + student[i].gi;
for (int j = 0; j < k; j++)scanf("%d", &student[i].choice[j]);
}
sort(student, student + n);
for (int i = 0; i < n; i++)
{
for(int j=0;j<k;j++)
{
int school_choice = student[i].choice[j];
if (school[school_choice].quota > 0)
{
school[school_choice].admit.push_back(student[i].id);
school[school_choice].quota--;
if (school[school_choice].quota == 0)
{
school[school_choice].last_fg = student[i].fg;
school[school_choice].last_ge = student[i].ge;
}
break;
}
else if (school[school_choice].quota == 0)
{
if (student[i].fg == school[school_choice].last_fg&&student[i].ge == school[school_choice].last_ge)
{
school[school_choice].admit.push_back(student[i].id);
break;
}
}
}
}
for (int i = 0; i < m; i++)
{
if (school[i].admit.size() == 0)printf("\n");
else
{
sort(school[i].admit.begin(), school[i].admit.end());
for (int j = 0; j < school[i].admit.size(); j++)
{
printf("%d", school[i].admit[j]);
if (j != school[i].admit.size() - 1)printf(" ");
else printf("\n");
}
}
}
return 0;
}