#include <bits/stdc++.h>
using namespace std;
struct student{
int id;
float Ge;
float Gi;
float final;
int choice[5];
int rank;
};
struct school{
int capacity; //招生容量
vector<student>accept; //最终录取的学生容器
}sch[101];
bool cmp(student a,student b){
if(a.final!=b.final)
return a.final>b.final;
else
return a.Ge>b.Ge;
}
bool cmp1(student a,student b){
return a.id<b.id;
}
int main(){
//读入输入
int n,m,k;cin>>n>>m>>k;
for(int i=0;i<m;i++)
cin>>sch[i].capacity;
vector<student>v;
for(int i=0;i<n;i++){
student temp;
cin>>temp.Ge>>temp.Gi;
temp.id=i;
temp.final=temp.Gi+temp.Ge;
for(int j=0;j<k;j++)
cin>>temp.choice[j];
v.push_back(temp);
}
//排序
sort(v.begin(),v.end(),cmp);
//确定每位学生的排名属性
int rank=1;student pre=v[0];
v[0].rank=rank;
for(int i=1;i<=v.size();i++){
if(v[i-1].final==pre.final&&v[i-1].Ge==pre.Ge)
v[i-1].rank=rank;
else{
rank=i;
pre=v[i-1];
v[i-1].rank=i;
}
}
//可以把这块取消注销,打印看看排名
// for(int i=0;i<v.size();i++)
// cout<<v[i].Ge<<" "<<v[i].Gi<<" "<<v[i].rank<<" "<<v[i].id<<endl;
//按排名从上到下,一个一个读取志愿
for(int i=0;i<v.size();i++){
for(int j=0;j<k;j++){
int schNum=v[i].choice[j];
if(sch[schNum].capacity>0){
sch[schNum].accept.push_back(v[i]);
sch[schNum].capacity--;
break; //只要录取了,就break,读取下一个学生
}
else{ //如果和目标院校最后一名同学排名相同,可以超额录取
if(v[i].rank==sch[schNum].accept[sch[schNum].accept.size()-1].rank){
sch[schNum].accept.push_back(v[i]);
break; //只要录取了,就break,读取下一个学生
}
}
}
}
//输出id
for(int i=0;i<m;i++){
vector<student>temp(sch[i].accept);
sort(temp.begin(),temp.end(),cmp1);
if(temp.size()==0)
cout<<endl;
else{
for(int j=0;j<temp.size()-1;j++)
cout<<temp[j].id<<" ";
cout<<temp[temp.size()-1].id<<endl;
}
}
}
1080 Graduate Admission 结构体排序
本文介绍了一种使用C++编写的算法,通过比较学生的学习成绩和综合能力,为大学招生过程中的学生排名和志愿分配提供解决方案。排序函数首先根据最终成绩和次级指标进行排序,然后确定每位学生的排名,确保公平录取。程序还考虑了志愿选择和学校招生容量限制,实现最优匹配。
摘要由CSDN通过智能技术生成