标签:
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 4
Sample Output:
0 10 3 5 6 7 2 8 1 4
思路:此题较为复杂,逻辑应该理清楚再进行,先对学生进行排名,然后根据学生排名进行第一志愿,第二志愿录取。 其中要注意学生的ID在排序前后有变化,另外,关于运行超时的问题:在cmp中多了一个if 和else 中可导致运行超时,以后一定要注意这个情况。
1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 #define MAX 40010 5 struct Student 6 { 7 int Id; 8 int choice[6]; 9 int Ge,Gi; 10 int rank; 11 int sum; 12 }stu[MAX]; 13 14 struct School 15 { 16 int id[MAX]; 17 int quota; 18 int last; 19 int now; 20 }sch[110]; 21 22 bool Cmp1(Student A,Student B) 23 { 24 if(A.sum!=B.sum) 25 return A.sum>B.sum; 26 /* 27 else if(A.Ge!=B.Ge) ///这句话多出一个判断可以运行超时 28 return A.Ge>B.Ge; 29 else 30 return true; */ 31 else 32 return A.Ge>B.Ge; 33 } 34 bool Cmp2(int a,int b) 35 { 36 return stu[a].Id<stu[b].Id; 37 } 38 int main() 39 { 40 int N,M,K; 41 scanf("%d%d%d",&N,&M,&K); 42 for(int i=0;i<M;i++) 43 { 44 scanf("%d",&sch[i].quota); 45 sch[i].last=-1; 46 sch[i].now=0; 47 } 48 for(int i=0;i<N;i++) 49 { 50 stu[i].Id=i; 51 scanf("%d%d",&stu[i].Ge,&stu[i].Gi); 52 stu[i].sum=stu[i].Ge+stu[i].Gi; 53 for(int j=0;j<K;j++) 54 { 55 scanf("%d",&stu[i].choice[j]); 56 } 57 } 58 sort(stu,stu+N,Cmp1); 59 //进行排名 60 stu[0].rank=0; 61 for(int i=1;i<N;i++) 62 { 63 if(stu[i-1].sum==stu[i].sum&&stu[i-1].Ge==stu[i].Ge) 64 stu[i].rank=stu[i-1].rank; 65 else 66 stu[i].rank=i; 67 } 68 //进行录取 69 for(int i=0;i<N;i++) 70 { 71 for(int j=0;j<K;j++) 72 { 73 int index=stu[i].choice[j]; 74 int now=sch[index].now; 75 int last=sch[index].last; 76 int quota=sch[index].quota; 77 if(now<quota||(last!=-1&&stu[i].rank==stu[last].rank)) 78 { 79 sch[index].id[now]=i; 80 sch[index].now++; 81 sch[index].last=i; 82 break; 83 } 84 } 85 } 86 //进行结果的输出 87 for(int i=0;i<M;i++) 88 { 89 if(sch[i].now>0) 90 { 91 sort(sch[i].id,sch[i].id+sch[i].now,Cmp2); 92 for(int j=0;j<sch[i].now;j++) 93 { 94 95 if(j==sch[i].now-1) 96 printf("%d\n",stu[sch[i].id[j]].Id); 97 else 98 printf("%d ",stu[sch[i].id[j]].Id); 99 } 100 } 101 else 102 putchar(‘\n‘); 103 104 } 105 return 0; 106 }
标签:
原文地址:http://www.cnblogs.com/GoFly/p/4291472.html