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
提交代码
思路:
1:学生按照指定的方式进行排序,排序优先级为最终分数高->ge高->,两个都一样,则相等。
2:然后根据排好序的学生次序,对每个学生指定其排名,注意这个排名是相同等级的排名一样,比如 (90,90),(90,90),(89,91),排名为1,1,2;
3:为学生指定排名,主要是因为对于学校,如果有一个学生恰好进入了这个学校,那么其他和这个学生排名相同的学生,只要选了这个学校,都有资格进入,
不收学校招生人数的影响。
4:然后就是从高到低,一次查看学生的志愿。每次学生申请学校成功,都要把其排名告诉给学校。这样,学校在招生满的时候,如果收到一个排名和其最低
招生排名相同的学生,就可以录取这个学生了。
5:接着就是打印每个学校录取的学生的id,排序从低到高输出就行。不要输出多余的信息。
//15:17 reading-> 15:23 thinking ->15:28 coding->16:20 finished #include <stdio.h> #include <iostream> #include <algorithm> #include <vector> using namespace std; struct Students { int id; double g1; double g2; double fg; int rank; int apps[7]; }; struct School { int quota; vector<int> stus; int lowerRank; }; Students stus[40003]; School schs[103]; int cmp(const void *a,const void *b) { Students x = *((Students *)a); Students y = *((Students *)b); if(x.fg!=y.fg) { return (x.fg>y.fg)?-1:1; }else if(x.g1!=y.g1) { return (x.g1>y.g1)?-1:1; }else { return 0; } } int main() { int n,m,k; int i,j,qu,s; scanf("%d%d%d",&n,&m,&k); for(i=0;i<m;i++) { scanf("%d",&schs[i].quota); schs[i].lowerRank = -1; } for(i=0;i<n;i++) { scanf("%lf%lf",&stus[i].g1,&stus[i].g2); stus[i].fg = (stus[i].g1+stus[i].g2)/2; stus[i].id = i; for(j=0;j<k;j++) { scanf("%d",&s); stus[i].apps[j] = s; } } qsort(&stus[0],n,sizeof(Students),cmp); int r=1,same = 0; i = 0; while(true) { same = 0; if(i>=n) { break; } stus[i].rank = r; while(i<n-1&&stus[i].fg==stus[i+1].fg && stus[i].g1==stus[i+1].g1) { stus[i+1].rank = r; same++; i++; } r += same; r++; i++; } for(i=0;i<n;i++) { for(j=0;j<k;j++) { s = stus[i].apps[j]; if(schs[s].stus.size()<schs[s].quota) { schs[s].stus.push_back(stus[i].id); schs[s].lowerRank = stus[i].rank; break; }else { if(schs[s].lowerRank==stus[i].rank) { schs[s].stus.push_back(stus[i].id); break; } } } } for(i=0;i<m;i++) { bool flag = false; if(schs[i].stus.size()>0) { //printf("%d ",i); sort(schs[i].stus.begin(),schs[i].stus.end()); for(j=0;j<schs[i].stus.size();j++) { printf("%d",schs[i].stus[j]); if(j!=schs[i].stus.size()-1) { printf(" "); } } }else { printf("\n"); flag = true; } if(i!=m-1&&!flag) { printf("\n"); } } return 0; }