大致题意就是有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. (四)开源C# WPF控件库《AduSkin – UI》

    微信公众号:[Dotnet9的博客],网站:[Dotnet9],问题或建议:[请网站留言], 如果对您有所帮助:[欢迎赞赏]. 开源C# WPF控件库系列: (一)开源C# WPF控件库<Mat ...

  2. netsh 查看自己的wifi密码。

    查看自己曾经连接过得wifi netsh wlan show profiles 断开wifi netsh wlan disconnect 查看密码 netsh wlan show profile na ...

  3. 基于tensorflow2.0和cifar100的VGG13网络训练

    VGG是2014年ILSVRC图像分类竞赛的第二名,相比当年的冠军GoogleNet在可扩展性方面更胜一筹,此外,它也是从图像中提取特征的CNN首选算法,VGG的各种网络模型结构如下: 今天代码的原型 ...

  4. java动态拼接sql语句并且执行时给sql语句的参数赋值

    问题 在这里举一个例子,比如我要做一个多条件模糊查询,用户输入的时候有可能输入一个条件,也有可能输入两个条件,这时执行查询的sql语句就不确定了,但可以用动态拼接sql语句来解决这个问题. 解决方法 ...

  5. 【python基础语法】第6天作业练习题

    ''' 二.作业(每一道题封装成一个函数) 1.输出99乘法表,结果如下:(提示嵌套for循环,格式化输出) 2.有1 2 3 4 这四个数字,设计程序计算能组成多少个互不相同且无重复数字的3位数?分 ...

  6. 解决mysql导入导出错误问题

    1.datetime类型: 当datetime的值为0000-00-00:00:00:00时,mysql是不接受此条数据的,当然可以 insert ignore into table--------- ...

  7. LeetCode 面试题 02.03. 删除中间节点

    题目链接:https://leetcode-cn.com/problems/delete-middle-node-lcci/ 实现一种算法,删除单向链表中间的某个节点(除了第一个和最后一个节点,不一定 ...

  8. react引入ggEditor流程图

    遇到的问题 1.propsAPI获取不到内容:withPropsAPI包裹的组件必须是GGEditor的子组件. 2.自定义组件如何使用:正确的办法是通过config配置,参照上面的代码(之前我在在内 ...

  9. 刷题79. Word Search

    一.题目说明 题目79. Word Search,给定一个由字符组成的矩阵,从矩阵中查找一个字符串是否存在.可以连续横.纵找.不能重复使用,难度是Medium. 二.我的解答 惭愧,我写了很久总是有问 ...

  10. Html介绍,认识html标签

    什么是网页?网页就是我们我们提前写好的代码样式经过浏览器的渲染展示出来的样式效果.其实我们常说的上网就是浏览各式各样的网页,这些网页都是由html标签组成,下面就是一个简单的网页,效果图如下: 简单看 ...