PAT-1080 Graduate Admission (结构体排序)
1080. Graduate Admission
It is said that in 2013, there were about 100 graduate schools ready to proceed over 40,000 applications in Zhejiang Province. It would help a lot if you could write a program to automate the admission procedure.
Each applicant will have to provide two grades: the national entrance exam grade GE, and the interview grade GI. The final grade of an applicant is (GE +
GI) / 2. The admission rules are:
- The applicants are ranked according to their final grades, and will be admitted one by one from the top of the rank list.
- If there is a tied final grade, the applicants will be ranked according to their national entrance exam grade GE. If still tied, their ranks must be the same.
- Each applicant may have K choices and the admission will be done according to his/her choices: if according to the rank list, it is one's turn to be admitted; and if the quota of one's most preferred shcool is not exceeded, then
one will be admitted to this school, or one's other choices will be considered one by one in order. If one gets rejected by all of preferred schools, then this unfortunate applicant will be rejected. - If there is a tied rank, and if the corresponding applicants are applying to the same school, then that school must admit all the applicants with the same rank, even if its quota will be exceeded.
Input Specification:
Each input file contains one test case. Each case starts with a line containing three positive integers: N (<=40,000), the total number of applicants; M (<=100), the total number of graduate schools; and K (<=5), the number of choices
an applicant may have.
In the next line, separated by a space, there are M positive integers. The i-th integer is the quota of the i-th graduate school respectively.
Then N lines follow, each contains 2+K integers separated by a space. The first 2 integers are the applicant's GE and GI, respectively. The next K integers represent
the preferred schools. For the sake of simplicity, we assume that the schools are numbered from 0 to M-1, and the applicants are numbered from 0 to N-1.
Output Specification:
For each test case you should output the admission results for all the graduate schools. The results of each school must occupy a line, which contains the applicants' numbers that school admits. The numbers must be in increasing
order and be separated by a space. There must be no extra space at the end of each line. If no applicant is admitted by a school, you must output an empty line correspondingly.
Sample Input:
11 6 3
2 1 2 2 2 3
100 100 0 1 2
60 60 2 3 5
100 90 0 3 4
90 100 1 2 0
90 90 5 1 3
80 90 1 0 2
80 80 0 1 2
80 80 0 1 2
80 70 1 3 2
70 80 1 2 3
100 100 0 2 4
Sample Output:
0 10
3
5 6 7
2 8 1 4
题目大意:学生申请学校的问题,有n个学生,m所学校,每个学生最多填报的志愿数为k,给出这m所学校的名额数。每个学生有GE和GI两门成绩,平均成绩高的则排在前面;若相等,则GE高的排在前面;再相等则排名相同。对于排名相同的学生,即使名额不够了也会一并接受,接着给出每个学生填报的k个学校的序号。要求输出每个学校最终招到的学生的序号。
主要思路:1. 建立包含每个学生的结构体数组,每个结构体包括学生的序号id,两项成绩gi和ge,以及一个含有其报名学校的数组;以一个二维的vector容器存放每个学校招收的学生,另用一个数组存放每个学校当前剩余的名额;
2. 成绩好的先选。按照成绩排序结构体数组,然后从前到后让每个学生依次选择学校,如果当前志愿学校名额>0,则被录取,该学校的名额数-1;如果名额=0,则与该学校已录取的最后一个学生比较,如果两人两门成绩分别相同,则该生被录取,否则考虑下一个志愿。注意要对每一个学校录取的学生的序号排序后再输出。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef struct info {
int id; //申请者序号(防止因排序打乱)
int ge, gi;
int school[5]; //申请者志愿
} applicant;
applicant a[40000];
int quota[100];
bool comp(applicant v, applicant w);
bool comp_id(applicant v, applicant w); int main(void) {
int n, m, k, i, j; cin >> n >> m >> k;
vector<vector<applicant> > vec(m);
for (i = 0; i < m; i++)
cin >> quota[i];
for (i = 0; i < n; i++) {
a[i].id = i;
cin >> a[i].ge >> a[i].gi;
for (j = 0; j < k; j++)
cin >> a[i].school[j];
}
sort(a, a + n, comp);
for (i = 0; i < n; i++) {
for (j = 0; j < k; j++) {
int id = a[i].school[j]; //成绩排行第i的申请者的第j个志愿的学校
if (quota[id] > 0) {
vec[id].push_back(a[i]);
quota[id]--;
break;
}
else if (quota[id] == 0) {
applicant t = vec[id].back(); //序号为id的学校录取的成绩最低的同学
if (a[i].ge == t.ge && a[i].gi == t.gi) { //成绩完全相同才说明排名相同
vec[id].push_back(a[i]);
break;
}
}
}
}
for (i = 0; i < m; i++) {
if (vec[i].size() == 0) {
cout << "\n";
continue;
}
sort(vec[i].begin(), vec[i].end(), comp_id); //对容器中的学生序号进行排序
cout << vec[i][0].id;
for (j = 1; j < vec[i].size(); j++)
cout << " " << vec[i][j].id;
cout << endl;
} return 0;
}
//按成绩排序
bool comp(applicant v, applicant w) {
if (v.ge + v.gi == w.ge + w.gi)
return v.ge > w.ge;
return (v.ge + v.gi) > (w.ge + w.gi);
}
//按序号排序
bool comp_id(applicant v, applicant w) {
return v.id < w.id;
}
PAT-1080 Graduate Admission (结构体排序)的更多相关文章
- 题目1005:Graduate Admission(结构体排序)
问题来源 http://ac.jobdu.com/problem.php?pid=1005 问题描述 这道题理解题意有些麻烦,多看几遍先理解题意再说.每个学生有自己的三个成绩,一个编号,以及一个志愿列 ...
- PAT 1080 Graduate Admission[排序][难]
1080 Graduate Admission(30 分) It is said that in 2011, there are about 100 graduate schools ready to ...
- PAT 1080. Graduate Admission (30)
It is said that in 2013, there were about 100 graduate schools ready to proceed over 40,000 applicat ...
- PAT 1080. Graduate Admission
It is said that in 2013, there were about 100 graduate schools ready to proceed over 40,000 applicat ...
- PAT 甲级 1080 Graduate Admission (30 分) (简单,结构体排序模拟)
1080 Graduate Admission (30 分) It is said that in 2011, there are about 100 graduate schools ready ...
- 1080 Graduate Admission——PAT甲级真题
1080 Graduate Admission--PAT甲级练习题 It is said that in 2013, there were about 100 graduate schools rea ...
- pat 甲级 1080. Graduate Admission (30)
1080. Graduate Admission (30) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue It ...
- PAT 乙级 1085. PAT单位排行 (25) 【结构体排序】
题目链接 https://www.patest.cn/contests/pat-b-practise/1085 思路 结构体排序 要注意几个点 它的加权总分 是 取其整数部分 也就是 要 向下取整 然 ...
- HDOJ 1009. Fat Mouse' Trade 贪心 结构体排序
FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
随机推荐
- CHIL-SQL-DELETE 语句
DELETE 语句 DELETE 语句用于删除表中的行. 语法 DELETE FROM 表名称 WHERE 列名称 = 值 Person: LastName FirstName Address Cit ...
- 从实践出发:微服务布道师告诉你Spring Cloud与Boot他如何选择
背景 随着公司业务量的飞速发展,平台面临的挑战已经远远大于业务,需求量不断增加,技术人员数量增加,面临的复杂度也大大增加.在这个背景下,平台的技术架构也完成了从传统的单体应用到微服务化的演进. 系统架 ...
- Node.js中的express框架,修改内容后自动更新(免重启),express热更新
个人网站 https://iiter.cn 程序员导航站 开业啦,欢迎各位观众姥爷赏脸参观,如有意见或建议希望能够不吝赐教! 以前node中的express框架,每次修改代码之后,都需要重新npm s ...
- C++如何求程序运行时间
C++中常用clock()函数求运行时间,返回值类型为clock_t,返回值是程序运行到本次调用clock()函数经过的clock数,头文件为<time.h>. 用法: 1.求开始时间s= ...
- MySQL 索引、视图
1.索引 什么是索引 一个索引是存储在表中的数据结构,索引在表的列名上创建.索引中包含了一个列的值,这些值保存在一个数据结构中 索引优缺点 索引大大提高了查询速度 会降低更新表的速度,如对表进行INS ...
- JSP+Spring+SpringMVC+Hibernate+Mysql实现的校园失物招领网站
项目简介 项目来源于:https://github.com/wenlongup/LostAndFound 因原github仓库无数据库文件,经过本人修改,现将该仓库重新上传至个人gitee仓库. ht ...
- A Simple Problem with Integers 循环节 修改 平方 找规律 线段树
A Simple Problem with Integers 这个题目首先要打表找规律,这个对2018取模最后都会进入一个循环节,这个循环节的打表要用到龟兔赛跑. 龟兔赛跑算法 floyed判环算法 ...
- SpringMVC源码学习:容器初始化+MVC初始化+请求分发处理+参数解析+返回值解析+视图解析
目录 一.前言 二.初始化 1. 容器初始化 根容器查找的方法 容器创建的方法 加载配置文件信息 2. MVC的初始化 文件上传解析器 区域信息解析器 handler映射信息解析 3. Handler ...
- 关于 k210 的 micropython 添加 ussl 模块,实现 https 访问支持的那些事。
起因 事情已经过去快一周了吧,继上次修复 maixpy k210 的 esp8285 at 通信后,突然遇到泽畔大大问,要不要做 ussl 的支持? 评估了一下各方的实现,想了一下自己也刚好在做网络层 ...
- Vue + Element-ui实现后台管理系统(5)---封装一个Form表单组件和Table表格组件
封装一个Form表单组件和Table组件 有关后台管理系统之前写过四遍博客,看这篇之前最好先看下这四篇博客.另外这里只展示关键部分代码,项目代码放在github上: mall-manage-syste ...