题目如下:
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; }