题目如下:
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:
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 4Sample Output:
0 10 3 5 6 7 2 8 1 4
题目要求对研究生入学考试的成绩进行按照一定的规则进行排名,然后根据每个人的志愿,按照排名先后根据学校的指标进行录取。
一个关键点在于排名一致的人如果申请同一个学校,并且此时指标还有剩余,则不论是否超标都要全部录取。
最关键的是排名算法的实现,先按照总分比较,总分一致再按照笔试成绩比较,笔试成绩相同的拥有相同的排名。
为了处理超标录取的情况,每个学校都记录一个last_rank代表上次录取的人的排名,如果新申请到来时已招满但是排名等于last_rank,说明属于排名一致的人申请同一学校,也应当被录取。
代码如下:
#include <iostream>
#include <vector>
#include <stdio.h>
#include <algorithm>
using namespace std;
struct School{
int quota;
int last_rank;
vector<int> admitList;
School(){
last_rank = -1;
}
};
struct Student{
int num;
int rank;
int Ge;
int Gi;
int Gf;
vector<int> applyList;
bool operator < (const Student &other) const{
if(Gf > other.Gf){
return true;
}else if(Gf == other.Gf){
if(Ge > other.Ge){
return true;
}else{
return false;
}
}else{
return false;
}
}
};
int main()
{
int N,M,K;
cin >> N >> M >> K;
vector<School> schs(N);
vector<Student> stus(N);
for(int i = 0; i < M; i++){
scanf("%d",&schs[i].quota);
}
int Ge,Gi,apply;
for(int i = 0; i < N; i++){
scanf("%d%d",&Ge,&Gi);
Student &stu = stus[i];
stu.Ge = Ge;
stu.Gi = Gi;
stu.Gf = (Ge + Gi) / 2;
stu.num = i;
for(int i = 0; i < K; i++){
scanf("%d",&apply);
stu.applyList.push_back(apply);
}
}
sort(stus.begin(),stus.end());
int rank = 0;
int rk_Gf = -1;
int rk_Ge = -1;
int rk_cnt = 1;
int inner_cnt = 1;
for(int i = 0; i < N; i++){
Student &stu = stus[i];
vector<int> applys = stu.applyList;
if(stu.Gf != rk_Gf){
rk_Gf = stu.Gf;
rk_Ge = stu.Ge;
rank += rk_cnt;
rk_cnt = 0;
}else if(stu.Ge != rk_Ge){
rk_Ge = stu.Ge;
rank += rk_cnt;
rk_cnt = 0;
}
rk_cnt++;
stu.rank = rank;
}
for(int i = 0; i < N; i++){
vector<int> applys = stus[i].applyList;
rank = stus[i].rank;
for(int j = 0; j < applys.size(); j++){
School &sch = schs[applys[j]];
if(sch.quota > 0){
sch.admitList.push_back(stus[i].num);
sch.last_rank = rank;
sch.quota--;
break;
}else if(sch.last_rank == rank){
sch.admitList.push_back(stus[i].num);
break;
}
}
}
for(int i = 0; i < M; i++){
School &sch = schs[i];
if(sch.admitList.size() > 0){
sort(sch.admitList.begin(),sch.admitList.end());
printf("%d",sch.admitList[0]);
for(int j = 1; j < sch.admitList.size(); j++){
printf(" %d",sch.admitList[j]);
}
}
cout << endl;
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/xyt8023y/article/details/48052965