大致题意就是有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. Go语言基础之接口(面向对象编程下)

    1 接口 1.1 接口介绍 接口(interface)是Go语言中核心部分,Go语言提供面向接口编程,那么接口是什么? 现实生活中,有许多接口的例子,比如说电子设备上的充电接口,这个充电接口能干什么, ...

  2. get、post请求参数乱码解决方法(qq:1324981084)

    java高级架构师全套vip教学视频,需要的加我qq1324981084 在实际的项目中我们会遇见中文乱码的问题,这个问题是很恶心的事,所以我在这里提供了一些解决中文乱码的方法,希望能给大家一些帮助. ...

  3. jQuery on 绑定的事件 执行两次

    $(".class1").on("click",".class2",function(){ alert('提示'); }); 上面代码,怎么 ...

  4. css常用样式对文本的处理演练

    CSS文本属性可定义文本的外观,这是毫无疑问的,其次css可以通过以下属性改变文字的排版,比方说letter-spacing实现字符间距text-indent: 2em;完成首行缩进2字符word-s ...

  5. Windows Server 2012 R2的安装(GUI桌面版本)

    镜像:cn_windows_server_2012_r2_x64_dvd_2707961.iso 1.将安装光盘插入服务器,开机会读取到Windows安装程序,点击下一步 2.点击现在安装     3 ...

  6. Chrome的插件扩展程序安装目录

    地址栏输入chrome:version回车 个人资料路径下的Extensions文件夹即默认的扩展安装路径

  7. .net 用反射获取当前运行的程序集中的所有Controller与Action

    public string InitPermission() { // 通过反射加载程序集 // var baseType = Assembly.LoadFile(@"G:\testproj ...

  8. 使用SignalR从服务端主动推送警报日志到各种终端(桌面、移动、网页)

    微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. 使用SignalR从服务端主动推送警报日志到各种终端(桌面.移动.网页) 阅读导航 本文背景 ...

  9. opencv二值化的cv2.threshold函数

    (一)简单阈值 简单阈值当然是最简单,选取一个全局阈值,然后就把整幅图像分成了非黑即白的二值图像了.函数为cv2.threshold() 这个函数有四个参数,第一个原图像,第二个进行分类的阈值,第三个 ...

  10. Linux学习笔记:磁盘分区

    本文更新于2019-12-30.操作系统为Debian 8.9 (jessie). 以下假设新磁盘为/dev/sdb,要创建一个分区/dev/sdb1,文件系统类型为xfs.请根据实际情况,自行选择. ...