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 <algorithm> #include <vector> using namespace std; struct Node { int GE,GI,avg; int apply[5]; int Index; friend bool operator < (Node n1, Node n2) { if(n1.avg == n2.avg) { return n1.GE > n2.GE; } return n1.avg > n2.avg; } }; Node list[40000],y[40000]; int N,M,K; vector<int> sc[100]; int scMax[100]; int main() { while(scanf("%d %d %d",&N,&M,&K) != EOF) { for(int i = 0; i < M; i++) { scanf("%d",&scMax[i]); sc[i].clear(); } for(int i = 0; i < N; i++) { list[i].Index = i; scanf("%d %d",&list[i].GE,&list[i].GI); list[i].avg = (list[i].GE + list[i].GI) / 2; for(int j = 0; j < K; j++) { scanf("%d",&list[i].apply[j]); } y[i].GE = list[i].GE; y[i].GI = list[i].GI; y[i].avg = list[i].avg; } sort(list, list + N); for(int i = 0; i < N; i++) { for(int j = 0; j < K; j++) { int Index = list[i].apply[j]; if(sc[Index].size() < scMax[Index]) { sc[Index].push_back(list[i].Index); break; } else { if(y[sc[Index].back()].avg == list[i].avg && y[sc[Index].back()].GE == list[i].GE) { sc[Index].push_back(list[i].Index); break; } } } } for(int i = 0; i < M; i++) { if(sc[i].size() == 0) { printf("\n"); } else { sort(sc[i].begin(),sc[i].end()); printf("%d",sc[i][0]); for(int j = 1; j < sc[i].size(); j++) { printf(" %d",sc[i][j]); } printf("\n"); } } } return 0; }