九度题目1005:Graduate Admission
2016-05-26 15:08
155 查看
May 26, 2016
作者:dengshuai_super
出处:http://blog.csdn.net/dengshuai_super/article/details/51507509
声明:自由转载,转载请注明作者及出处。
题目1005:Graduate Admission
输入:
输出:
样例输入:
样例输出:
作者:dengshuai_super
出处:http://blog.csdn.net/dengshuai_super/article/details/51507509
声明:自由转载,转载请注明作者及出处。
题目1005:Graduate Admission
题目描述:
It is said that in 2011, there are 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.
输入:
Each input file may contain more than 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.
输出:
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.
样例输入:
//N(≤40,000)申请人的总数; M(≤100)研究生院的总数; 11 6 3 //和K(≤5)一个申请人可能的选择的学校的数量。 2 1 2 2 2 3 //有M个正整数,第i个整数分别是第i个研究生院的名额 100 100 0 1 2 //然后,N行跟进,每行2 + K个整数,用空格隔开 60 60 2 3 5 //前2个整数分别是申请人的GE和GI。 在下面k个整数代 100 90 0 3 4 //表的首选学校。我们假设学校被编号从0到M-1, 90 100 1 2 0 //和本申请人的编号从0到N-1。 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
样例输出:
//每所学校的结果必须占据一行,其中包含了学校编号和被 //录取的申请人的数字编号 0 10 3 5 6 7 //该数字必须是递增的顺序并用空格隔开 2 8 //如果没有申请人被学校录取,你必须相应的输出一个空行 1 4
代码如下:
/***************************************************************************** * 九度题目1005:Graduate Admission ****************************************************************************** * by Deng shuai May 26 2016 * http://blog.csdn.net/dengshuai_super ****************************************************************************** * Copyright (c) 2016, Deng Shuai * All rights reserved. *****************************************************************************/ #include<iostream> #include<map> #include<algorithm> #include<vector> using namespace std; typedef struct { int GE,GI; int wanted[5];//学生想去的学校编号 } student; map<int,student> info; int compare(int a,int b); int main() { int N,M,K;//N:学生数;M:学校数;K:学生的志愿学校数。 while(cin>>N>>M>>K) { int num[100];//记录学校的名额 int rank[40000];//记录学生的排名 int temp;//想去的学校 vector<vector<int> > ivec(M); for(int i=0;i<N;i++) rank[i]=i;//先将学生的排名按照自己的序号初始化 for(int i=0;i<M;i++) cin>>num[i];//第i个研究生院的名额 for(int i=0;i<N;i++) { cin>>info[i].GE>>info[i].GI;//输入第i个学生的GE和GI成绩 for(int j=0;j<K;j++) cin>>info[i].wanted[j];//输入第i个学生的想去的K个学校的编号 } //录取名次排名 for(int i=0;i<N;i++) for(int j=i+1;j<N;j++) if(compare(rank[j],rank[i])==1) swap(rank[i],rank[j]);//执行后,rank[i]为学生i的排名 //录取过程 for(int i=0;i<N;i++) for(int j=0;j<K;j++) { temp=info[rank[i]].wanted[j]; if(ivec[temp].size()<num[temp]) {ivec[temp].push_back(rank[i]);break;} if(ivec[temp].size()>=num[temp]) { int last=*(ivec[temp].end()-1); if(compare(last,rank[i])==0) {ivec[temp].push_back(rank[i]);break;} else continue; }//if }//for //排序并输出 for(int i=0;i<M;i++) { if(ivec[i].size()==0) cout<<endl; else { sort(ivec[i].begin(),ivec[i].end()); for(vector<int>::iterator iter=ivec[i].begin();iter!=ivec[i].end();iter++) if(iter!=--ivec[i].end()) cout<<*iter<<" "; else cout<<*iter<<endl; }//else }//for }//while return 0; }//main //比较a,b两个学生的成绩,如果按照规则a的排名靠前,则返回1;两人并列排名返回0;b排名靠前返回-1. int compare(int a,int b) { if(info[a].GE+info[a].GI>info[b].GE+info[b].GI) return 1; if(info[a].GE+info[a].GI<info[b].GE+info[b].GI) return -1; if(info[a].GE+info[a].GI==info[b].GE+info[b].GI&&info[a].GE>info[b].GE) return 1; if(info[a].GE+info[a].GI==info[b].GE+info[b].GI&&info[a].GE<info[b].GE) return -1; if(info[a].GE+info[a].GI==info[b].GE+info[b].GI&&info[a].GE==info[b].GE) return 0; }
运行截图:
相关文章推荐
- 博客收集
- JS在一定时间内跳转页面及各种刷新页面的实现方法
- android 倒计时 CountDownTimer
- Java高级特性之泛型学习总结
- angular中get方法URL无法正确传输
- Linux编程学习之静态库和动态库
- 限制性定语从句和非限制性定语从句(基础)
- 转载:Data Guard Physical Standby Setup in Oracle Database 11g Release 2
- Android代码分析工具-Method profiling
- 奇葩的公司、奇葩的人
- 并发资源共享处理方案--初级
- ios 拨打电话
- db创建较简语法示例
- Node.js 连接 MySQL 并进行数据库操作
- windows环境下搭建python机器学习开发环境
- 安卓so动态库加载代理实现,可以实现C层的类反射效果
- 详解SQL集合运算
- Linux查看内核或系统版本总结
- gulp-babel
- 自定义xib步骤