这道题需要在学校录取的数组里面存放学生的结构体,而不是只存放id。如果存放id,1、2点会过不了。具体我也不知道为什么,还需要有好心人指点下。
#include <bits/stdc++.h>
using namespace std;
struct stu
{
int id, ge, gi, gf, r;
int choice[6]; //学生的志愿
};
bool cmp1(stu &a, stu &b)
{
return a.gf != b.gf ? a.gf > b.gf : a.ge > b.ge;
}
bool cmp2(stu a, stu b)
{
return a.id < b.id;
}
int main()
{
int n, m, k;
scanf("%d %d %d", &n, &m, &k);
vector<int> quota(m); //学校的名额
vector<stu> a(n), ad[m]; //a存放学生结构体,ad[m]存放学校录取的学生
for(int i = 0; i < m; i++) scanf("%d", "a[i]);
for(int i = 0; i < n; i++) {
scanf("%d %d", &a[i].ge, &a[i].gi);
a[i].gf = a[i].ge + a[i].gi;
a[i].id = i;
for(int j = 0; j < k; j++) {
scanf("%d", &a[i].choice[j]);
}
}
sort(a.begin(), a.end(), cmp1);
//对学生进行排名
a[0].r = 1;
for(int i = 1; i < n; i++) {
if(a[i].ge == a[i-1].ge && a[i].gf == a[i-1].gf)
a[i].r = a[i-1].r;
else
a[i].r = i + 1;
}
//排名从高到低,按学生的志愿顺序进行录取
for(int i = 0; i < n; i++) {
for(int j = 0; j < k; j++) {
int school = a[i].choice[j];
int last = ad[school].size() - 1;
if(quota[school] > 0) { //目标院校名额未满
ad[school].push_back(a[i]); //录取
quota[school]--; //名额--
break; //下一个学生
} else { //目标院校名额已满
if(a[i].r == ad[school][last].r) {//与最后一个录取的学生排名相同
ad[school].push_back(a[i]); //录取
break; //下一个
}
}
}
}
for(int i = 0; i < m; i++) {
sort(ad[i].begin(), ad[i].end(), cmp2);
for(int j = 0; j < ad[i].size(); j++) {
if(j != 0) printf(" ");
printf("%d", ad[i][j].id);
}
printf("\n");
}
return 0;
}