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) ...
随机推荐
- Linux系统管理第四次作业 磁盘管理 文件系统
1.为主机新增两块30GB的SCSI硬盘 2.划分3个主分区,各5GB,剩余空间作为扩展分区 [root@localhost ~]# fdisk /dev/sdb 欢迎使用 fdisk (util-l ...
- MySQL数据库入门详细笔记
ps: 中括号[]里的内容都是可以省略的,按需要添加 数据库操作 创建数据库 语法:create database [if not exists] 数据名 charset=gbk; create da ...
- 标准库shelve
shelve模块是一个简单的k,v将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...
- Centos7网络配置( 网关、dns、ip地址配置)
0.前提:设置VMware的虚拟网络编辑器 子网和网关设置 虚拟网络编辑器 1.配置DNS(可忽略) $vim /etc/resolv.conf nameserver 192.168.0.1 2. ...
- Android原生多语言切换方案,兼容Android10
前言 一个应用若需要国际化,至少需要支持中文和英语这两种语言,而同时随着谷歌的系统的更新,安卓系统可以设置当前语言的首选语言.因此,本文立足于此,多语言的切换方案为:App固定的文字内容,跟随系统,中 ...
- centos7 源码安装goaccess
1. 使用yum安装在不同服务器上可能失败, 推荐使用源码安装goaccess # 安装依赖 yum install -y ncurses-devel GeoIP-devel.x86_64 tokyo ...
- 搜索+简单dp
前言:即使是简单的递归,在复杂度过高时也可以使用简单的dp. 一般有两种情况,一是利用dp思想求最优子结构进行搜索剪枝,二是利用搜索进行dp数组的填充. 例题一.hdu1978 题目大意:这是一个简单 ...
- Spring学习笔记(八)Spring Data JPA学习
jpa简单的命名规则如下,这个不多做介绍,放在这里也是给自己以后查找起来方便,这篇文章主要介绍之前一直忽略了的几个点,像@NoRepositoryBean这个注解,以及怎么自定义Repositor ...
- 【Spark】SparkStreaming和Kafka的整合
文章目录 Streaming和Kafka整合 概述 使用0.8版本下Receiver DStream接收数据进行消费 步骤 一.启动Kafka集群 二.创建maven工程,导入jar包 三.创建一个k ...
- Linux 通过终端命令行切换系统语言
通过命令的形式修改系统的语言,比较详细的讲解了来龙去脉: 文章目录 0 前言 1 locale 文件 2 查找相关文件 3 解决方案 4 相关信息 4.1 locale属性的含义 4.2 LANGUA ...