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
#include<stdio.h> #include<iostream> #include<vector> #include<algorithm> using namespace std; struct Student{ int rank; int id; int Ge; int Gi; float average; vector<int>app_School; Student(){ rank = -1; id = -1; Ge = 0; Gi = 0; average = 0; app_School.clear(); } }; struct School{ int id; int quota; vector<int>receive_Stu; School(){ id = -1; quota = 0; receive_Stu.clear(); } }; bool cmp(Student A, Student B){ if (A.average != B.average)return A.average > B.average; else if (A.Ge != B.Ge)return A.Ge > B.Ge; else return A.id < B.id; } bool cmp_by_id(int A,int B){ return A < B; } int main(){ freopen("F://Temp/input.txt", "r", stdin); int N, M, K; cin >> N >> M >> K; School *school = new School[M]; Student *student = new Student[N]; for (int i = 0; i < M; i++){ school[i].id = i; cin >> school[i].quota; } for (int i = 0; i < N; i++){ student[i].id = i; cin >> student[i].Ge >> student[i].Gi; student[i].average = (student[i].Ge*1.0 + student[i].Gi) / 2; for (int j = 0; j < K; j++){ int app_school_input; cin >> app_school_input; student[i].app_School.push_back(app_school_input); } } sort(student, student + N, cmp); for (int i = 0; i < N; i++){ if (i == 0){ student[i].rank = 0; } else{ if (student[i].average != student[i - 1].average || student[i].Ge != student[i - 1].Ge){ student[i].rank = i; } else{ student[i].rank = student[i - 1].rank; } } } int *id2rank = new int[N]; //易错点,因为前后的编号变化了 for (int i = 0; i < N; i++){ id2rank[student[i].id] = student[i].rank; } for (int i = 0; i < N; i++){ for (int j = 0; j < K; j++){ int cur_school = student[i].app_School[j]; if (school[cur_school].receive_Stu.size() < school[cur_school].quota){ //如果学校的配额还没满,则接收 school[cur_school].receive_Stu.push_back(student[i].id); break; } else if(school[cur_school].quota > 0){ //这里也要注意,怕万一学校的quota为0 int size = school[cur_school].receive_Stu.size(); int last_student = school[cur_school].receive_Stu[size - 1]; if (student[i].rank == id2rank[last_student]){ //如果学校的配额满了,但是同学的平均和Ge分数都和学校最后一位同学相同,也接收 school[cur_school].receive_Stu.push_back(student[i].id); break; } else{ continue; } } } } for (int i = 0; i < M; i++){ int size = school[i].receive_Stu.size(); sort(school[i].receive_Stu.begin(), school[i].receive_Stu.end(), cmp_by_id); for (int j = 0; j < size; j++){ if (j == 0)cout << school[i].receive_Stu[j]; else{ cout << " " << school[i].receive_Stu[j]; } } cout << endl; } return 0; }