大致题意就是有N个学生,有M个学校,每个学校的名额都是正整数。每个学生可以填K个学校志愿,N个学生一起排名以后,排名高的学生先挑学校,不保护一志愿。

题目要求:

首先,把所有学生按总成绩SUM(GE+GI)递减排序,如果SUM相同,那么就按GE递减排序。

然后,根据成绩确定所有学生的名次。如果当前学生与上一个学生的SUM和GE相同,那么当前学生与上一个学生的名次也相同。

确定所有学生的名次以后,从排名第一名的学生的第一个志愿学校开始。

如果该学校有名额,或者该学校没名额了但是该学生与该学校录取的最后一个学生的名次一样,那么就录取这名学生。

否则,该学生继续找下一个志愿学校,直到能找到能被录取的学校(该学校名额减一),或者所有志愿学校找完都无法被录取。

所有学生的志愿学校都找完以后,每个学校按要求递增输出学生编号。(具体不再赘述)

STL:set容器及其函数,sort函数,auto智能指针。

注意点:学生排序以后,学生id与数组i可能不一致了。代码中的last应该存放i(当前访问的学生),而不是学生id。

 #include"iostream"
#include"set"
#include"algorithm"
using namespace std;
struct Student {
int GE,GI,SUM;//考研成绩,面试成绩,总分
int id;//学生编号
int RANK;//排名
int choices[];//k<=5个志愿
} stu[]; struct School {
int quota;//学校名额
set<int> ID;//录取学生编号,set可以自动排序
int last = -;//标记最后一个被录取学生的编号
} sch[]; bool cmp(const Student& a,const Student& b) { //采用引用变量执行更快
if(a.SUM != b.SUM)
return a.SUM > b.SUM;
else
return a.GE > b.GE;
} int main() {
int N,M,K;
scanf("%d%d%d",&N,&M,&K);
for(int i = ; i < M; ++i) {
scanf("%d",&sch[i].quota);
}
for(int i = ; i < N; ++i) {
scanf("%d%d",&stu[i].GE,&stu[i].GI);
for(int j = ; j < K; ++j) {//K个志愿
scanf("%d",&stu[i].choices[j]);
}
stu[i].id = i;//学生id
stu[i].SUM = stu[i].GE + stu[i].GI;//总成绩
}
sort(stu,stu+N,cmp);//对学生进行排名,排序以后id与i就可能不一致了
for(int i = ; i < N; ++i) {//设置每个学生的名次
if(i > && stu[i].SUM == stu[i-].SUM && stu[i].GE == stu[i-].GE) //如果两个学生的SUM和GE相同,那么他们的名次也相同
stu[i].RANK = stu[i-].RANK;
else
stu[i].RANK = i;
}
for(int i = ; i < N; ++i) {
for(int j = ; j < K; ++j) {
int choice = stu[i].choices[j];//当前学生的当前志愿
int last = sch[choice].last;//最后一个被录取的学生
//学校有名额,或者该学校录满了但该学生与已录取的最后一个学生的名次一样时
if(sch[choice].quota > || stu[i].RANK == stu[last].RANK) {
sch[choice].ID.insert(stu[i].id);//录入学生 id
sch[choice].last = i;//记录当前访问了的学生,之前i写成了stu[i].id导致测试点1,2未通过,妹的!!!
sch[choice].quota--;//名额减一
break;
}
}
}
for(int i = ; i < M; ++i) {
int t = sch[i].ID.size();
if(t > ) {
//auto 是C++11里面的新特性,可以让编译器根据初始值类型直接推断变量的类型
for(auto it = sch[i].ID.begin(); it!=sch[i].ID.end(); ++it) {
printf("%d",*it);
if(t-- > ) {
printf(" ");
}
}
}
printf("\n");
}
return ;
}

  

1080 Graduate Admission的更多相关文章

  1. PAT 1080 Graduate Admission[排序][难]

    1080 Graduate Admission(30 分) It is said that in 2011, there are about 100 graduate schools ready to ...

  2. pat 甲级 1080. Graduate Admission (30)

    1080. Graduate Admission (30) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue It ...

  3. PAT 甲级 1080 Graduate Admission (30 分) (简单,结构体排序模拟)

    1080 Graduate Admission (30 分)   It is said that in 2011, there are about 100 graduate schools ready ...

  4. 1080 Graduate Admission——PAT甲级真题

    1080 Graduate Admission--PAT甲级练习题 It is said that in 2013, there were about 100 graduate schools rea ...

  5. 1080. Graduate Admission (30)

    时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue It is said that in 2013, there w ...

  6. PAT 1080. Graduate Admission (30)

    It is said that in 2013, there were about 100 graduate schools ready to proceed over 40,000 applicat ...

  7. 1080 Graduate Admission (30)(30 分)

    It is said that in 2013, there were about 100 graduate schools ready to proceed over 40,000 applicat ...

  8. PAT 1080. Graduate Admission

    It is said that in 2013, there were about 100 graduate schools ready to proceed over 40,000 applicat ...

  9. PAT (Advanced Level) 1080. Graduate Admission (30)

    简单题. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #in ...

  10. PAT甲级1080 Graduate Admission【模拟】

    题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805387268571136 题意: 模拟高考志愿录取. 考生根据总 ...

随机推荐

  1. JavaScript节流与防抖函数封装

    js节流与防抖函数封装 常见应用场景: window的 resize 和 scroll 事件: 文字输入时的 keyup 事件: 元素拖拽.移动时的 mousemove 事件: 防抖 定义:多次触发事 ...

  2. pikachu-越权漏洞(Over Permission)

    一.越权漏洞概述 1.1 概述     由于没有用户权限进行严格的判断,导致低权限的账户(例如普通用户)可以去完成高权限账户(例如管理员账户)范围内的操作. 1.2 越权漏洞的分类 (1)平行越权   ...

  3. JavaScript之BOM基础

    BOM(Browser Object Model)也叫浏览器对象,它提供了很多对象,用于访问浏览器的功能.但是BOM是没有标准的,每一个浏览器厂家会根据自己的需求来扩展BOM对象.本文主要以一些简单的 ...

  4. 解决Fail to post notification on channel "null"的方法

    mNotifyMgr = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);mNotifyMgr.cancelAll(); St ...

  5. Linux安装Redis、后台运行、系统自启动

    Redis是用C语言编写的开源免费的高性能的分布式内存数据库,基于内存运行并支持持久化的NoSQL数据库. 安装 1)从官网http://download.redis.io/releases/下载re ...

  6. redis 5.0.7 源码阅读——动态字符串sds

    redis中动态字符串sds相关的文件为:sds.h与sds.c 一.数据结构 redis中定义了自己的数据类型"sds",用于描述 char*,与一些数据结构 typedef c ...

  7. Windwos应急响应和系统加固(1)——Windwos操作系统版本介绍

    Windwos操作系统版本介绍 1. Micorsoft  Windows XP  ·Microsoft官方发布时间以及终止提供服务时间:2001.10.25-2014.4.8   产生漏洞:MS08 ...

  8. VEH帮你定位程序崩溃地址

    之前朋友有一个服务端程序,总是受到一些人的恶意漏洞攻击,没有源代码,只好反汇编修复了漏洞,并且使用WinLicense加保护授权. 漏洞总不是一次可以修复完的,恶意攻击并没有停止,然后加了WL保护程序 ...

  9. Mac 下如何快速重启 Dock 栏?

    两种方法. 如果Dock栏出现了问题或是没有反应,请打开Launchpad并按下Command+D键. 这样就可以关闭Dock栏并重启它,效果和经常用到的killall Dock命令相同.

  10. VM虚拟机扩展Ubuntu磁盘空间

    VM虚拟机扩展Ubuntu磁盘空间 1 环境 VMware版本号:15.0.2 build-10952284 系统:Ubuntu18.04 Ubuntu只挂载一个硬盘,无分区 /dev/sda1 2 ...