PAT 甲级 A1080 (2019/02/18)

#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;
}

猜你喜欢

转载自www.cnblogs.com/zjsaipplp/p/10425245.html