#include<cstdio>
#include<algorithm>
using namespace std;
struct Student{
int GE, GI, SUM; //初试分,面试分,总分
int rank, stuID; //名次, 考生id
int cho[6]; //志愿
}stu[40010];
struct School{
int quota; //招生人数
int stuNum; //实际招生人数
int ID[40010]; //招收学生的编号
int lastAdmit; //记录最后一个招收的考生
}sch[101];
bool stucmp(Student a, Student b){
if(a.SUM != b.SUM) return a.SUM > b.SUM; //按照总分从大到小排序
else return a.GE > b.GE; //按照初试成绩从大到小排序
}
bool IDcmp(int a, int b){
return stu[a].stuID < stu[b].stuID;//按照考生id从小到大排序
}
int main(){
int n, k, m;
scanf("%d%d%d", &n, &m, &k);
//初始化
for(int i = 0; i < m; i++){
scanf("%d", &sch[i].quota);//计划录取人数
sch[i].stuNum = 0; //实际录取人数为0
sch[i].lastAdmit = -1; //最后一个录取的考生的id为-1
}
//依次输入n个学生的信息
for(int i = 0; i < n; i++){
stu[i].stuID = i; //考生编号为i
scanf("%d%d", &stu[i].GE, &stu[i].GI); //输入初试,面试成绩
stu[i].SUM = stu[i].GE + stu[i].GI; //计算总分
for(int j = 0; j < k; j++){
scanf("%d", &stu[i].cho[j]); //志愿1,2,3...
}
}
sort(stu, stu + n, stucmp);
//计算每个考生的排名
for(int i = 0; i < n; i++){
//计算每个考生的排名
if(i > 0 && 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;
}
}
//学校录取
for(int i = 0; i < n; i++){ //n个考生
for(int j = 0; j < k; j++){ //每个考生 K 个志愿
int stuijcho = stu[i].cho[j]; //考生i的第j志愿(为学校编号)
int num = sch[stuijcho].stuNum; //学校stuijcho的当前录取人数
int last = sch[stuijcho].lastAdmit; //选择学校最后一位录取的考生编号
if(num < sch[stuijcho].quota || (last != -1 && stu[i].rank ==stu[last].rank)){
sch[stuijcho].ID[num] = i; //录取该考生
sch[stuijcho].lastAdmit = i; //该学校录取的最后一位考生变为i
sch[stuijcho].stuNum++; //当前招生人数加1
break;
}
}
}
//对学校
for(int i = 0; i < m; i++){
if(sch[i].stuNum > 0){ //如果招到考生
//按照id排序
sort(sch[i].ID, sch[i].ID + sch[i].stuNum, IDcmp);
for(int j = 0; j < sch[i].stuNum; j++){
printf("%d", stu[sch[i].ID[j]].stuID);
if(j < sch[i].stuNum - 1){
printf(" ");
}
}
}
printf("\n");
}
return 0;
}
原文地址:https://www.cnblogs.com/zjsaipplp/p/10425245.html
时间: 2024-09-29 23:17:56