信息处理排序--PAT.1080.Graduate Admission【余3】

来源:互联网 发布:免费聊天软件 编辑:程序博客网 时间:2024/06/06 02:25

【三个测试点过不了,先不找了】

/**********************3stone********************************* FileName: PAT.1080.Graduate Admission(30)Author:3stoneTime:2017/3/2题意:信息处理并排序题 ***********************3stone*********************************/#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<queue>#include<functional>#define maxSize 10000using namespace std;/*录取要求: score = (ge + gi) / 2 1、按分数排序,从高往低录取 2、 score相同,ge高者优先;若ge仍一样,则排名相同3、考生按名次向下扫描,其志愿依次扫描若有空额,即录取 4、若同名次的考生申请同一学校,即使超过该学校的定额,仍都录取     【若一志愿满额且排名同,二志愿有空,仍一志愿超额录取】 输出要求:每个学校一行,递增输出号码;未录取学生的学校输出空行 还有三个小测试点过不了!! */struct student{    int id; //编号     int ge, gi;     int prefer[6];//志愿     int ga; //平均分     int place; //排名 }stu[40010];int quota[110];//学校的配额 int flag[4010] = {0};//学生是否被录取 queue<int> school[110]; bool cmp(student a, student b){    if(a.ga != b.ga)        return a.ga > b.ga;    else if(a.ge != b.ge)        return a.ge > b.ge;    else         return a.id < b.id;}int main(){    int n, m, k;//人数、学校数、志愿数     scanf("%d%d%d", &n, &m, &k);//  while(scanf("%d%d%d", &n, &m, &k) != EOF){        for(int i = 0; i < m;i++){            scanf("%d", &quota[i]);        }         for(int i = 0; i < n; i++){//输入数据             stu[i].id = i;             scanf("%d%d", &stu[i].ge, &stu[i].gi);//成绩            stu[i].ga = (int)((stu[i].ge + stu[i].gi) / 2);            for(int j = 0; j < k; j++)//志愿                 scanf("%d", &stu[i].prefer[j]);        }        sort(stu, stu + n, cmp); //未实现相同排名        stu[0].place = 1; //初始化排名【处理相同排名】         for(int i = 1; i < n; i++){            if(stu[i-1].ga == stu[i].ga && stu[i-1].ge == stu[i].ge)                stu[i].place = stu[i-1].place;            else//              stu[i].place = stu[i-1].place + 1;                stu[i].place = i + 1;        }         for(int i = 0; i < m; i++){//清容器            while(school[i].empty() == false)                school[i].pop();        } /*              for(int i = 0; i < n; i++){//输出序号和成绩             printf("%d ", stu[i].id);        }        printf("\n");        for(int i = 0; i < n; i++){//输出序号和成绩             printf("%d ", stu[i].place);        }        printf("\n");        for(int i = 0; i < n; i++){            printf("%d ", stu[i].ga);        }        printf("\n"); */        //筛选志愿         for(int i = 0;i < n; i++){//遍历每一个学生             for(int j = 0; j < k; j++){//遍历志愿                 if(quota[ stu[i].prefer[j] ] > 0){                    quota[ stu[i].prefer[j] ]--;                    school[ stu[i].prefer[j] ].push(stu[i].id);                    flag[stu[i].id] = 1;                    break;                }//队列非空则进入【含义:判断是否学校定额本身为0】                 else if(!school[ stu[i].prefer[j] ].empty()){                    //检查是否有同名被录取的情况                    int last_one = school[ stu[i].prefer[j] ].back();//最后一个被录取的人                     if(stu[i].place == stu[last_one].place)//排名相同,录取                         school[stu[i].prefer[j]].push(stu[i].id);                 }             }         }//for - i 录取         //按学校输出【递增输出,每个队列用优先队列实现一下】         for(int i = 0; i < m; i++){            if(school[i].empty() == false){//优先级队列实现递增                 priority_queue<int, vector<int>, greater<int> > temp;                while(temp.empty() == false) temp.pop();                 while(school[i].empty() == false){                    temp.push(school[i].front());                    school[i].pop();                }                while(temp.size() != 1){                    printf("%d ", temp.top());                    temp.pop();                }                printf("%d\n", temp.top());            }            else                printf("\n");//此学校未录取学生         } //  }//while            return 0;}
0 0
原创粉丝点击