#include <iostream> #include<algorithm> #include <vector> using namespace std; struct ApplicantInfo{ int id; int rank; int GE; int GI; double Average; ApplicantInfo(int _id,int _GE,int _GI,double _Average){ id = _id; GE = _GE; GI = _GI; Average = _Average; } }; bool cmp(ApplicantInfo a,ApplicantInfo b){ if(a.Average>b.Average) return true; else if(a.Average==b.Average){ if(a.GE>b.GE) return true; } return false; } bool cmpid(ApplicantInfo a,ApplicantInfo b){ return a.id<b.id; } int main() { int N,M,K; while (cin >> N >> M >> K) { // 注意 while 处理多个 case vector<int> schoolQuotaNumber(M);//学校最多招收人数 vector<vector<ApplicantInfo>> schoolApplicant(M);//某学校录取学生的信息 vector<vector<int>> ApplicantChoice(N);//某学生的学校选择 vector<ApplicantInfo> info;//学生信息 //信息处理 for(int i=0;i<M;i++) cin>>schoolQuotaNumber[i]; for(int i=0;i<N;i++){ int ge,gi,choice; cin>>ge>>gi; for(int j=0;j<K;j++){ cin>>choice; ApplicantChoice[i].emplace_back(choice); } info.emplace_back(i,ge,gi,(ge*1.0+gi*1.0)/2); } //根据成绩排序 sort(info.begin(),info.end(),cmp); //计算排名 info[0].rank=1; int count=1; for(int i=1;i<N;i++){ count++; if(info[i].Average<info[i-1].Average){ info[i].rank= count;//平均分不相等排名为前面的人数+1 }else{ if(info[i].GE<info[i-1].GE){ info[i].rank = count; }else{//平均分,GE分全相等排名相等 info[i].rank = info[i-1].rank; } } } //根据排名录取 for(int i=0;i<N;i++){ int rank = info[i].rank; int id = info[i].id; for(int j=0;j<ApplicantChoice[id].size();j++){ int choice = ApplicantChoice[id][j]; if(schoolQuotaNumber[choice]>0){ schoolApplicant[choice].emplace_back(info[i]); schoolQuotaNumber[choice]--; break;//只能被一个学校录取 }else{ int size = schoolApplicant[choice].size();//该学校已经录取的人数 int thelastrank = schoolApplicant[choice][size-1].rank; if(thelastrank==rank) //和最后一名排名一样就算人数已满也要招进去 { schoolApplicant[choice].emplace_back(info[i]);//录取进这个学校 break;//只能被一个学校录取 } } } } //按照id排序 for(int i=0;i<M;i++) sort(schoolApplicant[i].begin(),schoolApplicant[i].end(),cmpid); //输出 for(int i=0;i<M;i++){ int size = schoolApplicant[i].size(); for(int j=0;j<size;j++){ if(j!=0) cout<<" "; cout<<schoolApplicant[i][j].id; } if(i!=M-1) cout<<endl; } } } // 64 位输出请用 printf("%lld")