测试点1,2,注意比较是否和上个学生成绩相同时,记录的是学校的id,但是误以为id是stu[i]结构体的i,即次序
正确方法是记录下次序,若记录id依次比较会超时
以下是正确代码
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
struct Student{
int gradeE,gradeI,id,sum,school[10];
}stu[40001];
struct school{
int stu[40001],num,quote,nowAdmit=0,lastTh;
}sch[110];
bool cmpG(Student a,Student b){
if(a.sum!=b.sum)return a.sum>b.sum;
else return a.gradeE>b.gradeE;
}
bool cmpId(int a,int b){
return a<b;
}
int main()
{
int n,m,k;//n申请者数,m研究所数,k申请者可选择的数量
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<m;i++){
scanf("%d",&sch[i].quote);
}
for(int i=0;i<n;i++){
scanf("%d%d",&stu[i].gradeE,&stu[i].gradeI);
stu[i].id = i;
stu[i].sum = stu[i].gradeE+stu[i].gradeI;
for(int j=0;j<k;j++){
scanf("%d",&stu[i].school[j]);
}
}
sort(stu,stu+n,cmpG);
for(int i=0;i<n;i++){
for(int j=0;j<k;j++){
int wantSch = stu[i].school[j];//心仪学校的id
if(sch[wantSch].quote>sch[wantSch].nowAdmit)
{
sch[wantSch].stu[sch[wantSch].nowAdmit++] = stu[i].id;
sch[wantSch].lastTh = i;//记录次序而不是id
break;
}
else if(sch[wantSch].nowAdmit>0){
int lastTh = sch[wantSch].lastTh;//因为次序已经变更过,不会再改变了
if(stu[i].sum==stu[lastTh].sum&&stu[i].gradeE==stu[lastTh].gradeE){
sch[wantSch].stu[sch[wantSch].nowAdmit++] = stu[i].id;
break;
}
}
}
}
for(int i=0;i<m;i++){
int count = sch[i].nowAdmit;
sort(sch[i].stu,sch[i].stu+count,cmpId);
for(int j=0;j<count;j++){
printf("%d",sch[i].stu[j]);
if(j!=count-1) printf(" ");
}
printf("\n");
}
return 0;
}