#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int want[106]; //各学校招生人数 struct Student { int GE,GI,sum,rank,ID; int prefer[6]; bool R; //代表该生录取情况 }STU[40066]; bool cmp(Student a,Student b) { if(a.sum!=b.sum) return a.sum>b.sum; else return a.GE>b.GE; } int main() { memset(STU,0,sizeof(STU)); fill(want,want+106,-1); //各学校招生人数初始设置-1 int n,m,k; //n名考生,m所学校,k个志愿 scanf("%d%d%d",&n,&m,&k); for(int i=0 ; i<m ; ++i) //输入各学校招生人数 scanf("%d",&want[i]); for(int i=0 ; i<n ; ++i) { scanf("%d %d",&STU[i].GE, &STU[i].GI); //填入分数 STU[i].sum=STU[i].GE+STU[i].GI; //填入总分 STU[i].ID=i; //填入编号 for(int j=0 ; j<k ; ++j) { int tmp=-1; scanf("%d",&tmp); //填入志愿 STU[i].prefer[tmp]=1; } } sort(STU,STU+n,cmp); STU[0].rank=1; for(int i=1 ; i<n ; ++i) //填入排序 { if(STU[i].sum==STU[i-1].sum && STU[i].GE==STU[i-1].GE) STU[i].rank=STU[i-1].rank; else STU[i].rank=i+1; } //学校优先选择权法(不符合题意) for(int i=0 ; i<m ; ++i) //输出各学校录取信息 { int top=0; //用于输出并列排名的破格录取 int kongge=0; //控制空格的输出 for(int j=0 ; j<n ; ++j) { if(STU[j].R==0 && STU[j].prefer[i]==1 && (want[i]>0 || want[i]==0 && STU[j].rank==top)) //该生未被录取,该生报考这个学校,该校还招人;或者学校招满,只招并列此名次的同学 { if(kongge!=0) printf(" "); printf("%d",STU[j].ID); kongge=1; top=STU[j].rank; //记录该考生的排名 STU[j].R=1; //标记考生已投档 --want[i]; //招生需求人数-1 } } printf("\n"); } return 0; }
时间: 2024-11-10 12:54:00