信息处理排序--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", "a[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
- 信息处理排序--PAT.1080.Graduate Admission【余3】
- pat 1080. Graduate Admission(排序模拟)
- 【PAT】1080. Graduate Admission
- PAT 1080. Graduate Admission (30)
- PAT 1080. Graduate Admission (30)
- PAT 1080. Graduate Admission (30)
- 【PAT】1080. Graduate Admission (30)
- 1080. Graduate Admission (30) PAT
- pat-1080. Graduate Admission (30)
- PAT 1080. Graduate Admission (30)(志愿录取,排序,rank)
- PAT-A1080. Graduate Admission (30)(排序)
- PAT (Advanced) 1080. Graduate Admission (30)
- PAT Advanced Level 1080. Graduate Admission (30)
- PAT A 1080. Graduate Admission (30)
- PAT(A) - 1080. Graduate Admission (30)
- 1080. Graduate Admission (30) PAT 甲级
- PAT甲级练习1080. Graduate Admission (30)
- PAT-A-1080. Graduate Admission (30)
- 新机PE环境安装系统出现的问题,EFI RART发现红× 解决方法
- Sublime Text 3在Windows下配置C++环境
- ListView的侧滑删除原来如此简单
- idea启动tomcat远程debug
- Qt修炼手册9_Ui名字空间及setupUi()原理解读
- 信息处理排序--PAT.1080.Graduate Admission【余3】
- Android开发-单选框/多选框
- mysql学习之基础知识
- [leetcode] 100. Same Tree
- Android常见内存泄露,学会这六招大大优化APP性能
- redis 集群(3.0版本开始支持集群功能)
- springboot-springSecurity 之 http Basic认证 (四)
- 78. Subsets
- EAS BOS F7控件过滤(含表头和表体)