标签:
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 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<stack> 5 #include<set> 6 #include<map> 7 #include<queue> 8 #include<algorithm> 9 using namespace std; 10 struct application{ 11 int GE,GI,sum,num; 12 int want[5];//开始写成3,错了! 13 }; 14 vector<int> sch[105]; 15 application app[40005]; 16 int sum[40005],GE[40005]; 17 int school[105]; 18 bool cmp(application a,application b){ 19 if(a.sum==b.sum){ 20 return a.GE>b.GE; 21 } 22 return a.sum>b.sum; 23 } 24 int main(){ 25 //freopen("D:\\INPUT.txt","r",stdin); 26 int n,m,k,i,j; 27 scanf("%d %d %d",&n,&m,&k); 28 for(i=0;i<m;i++){ 29 scanf("%d",&school[i]); 30 } 31 for(i=0;i<n;i++){ 32 scanf("%d %d",&app[i].GE,&app[i].GI); 33 GE[i]=app[i].GE; 34 sum[i]=app[i].sum=app[i].GE+app[i].GI; 35 app[i].num=i; 36 for(j=0;j<k;j++){//开始写成3,错了! 37 scanf("%d",&app[i].want[j]); 38 } 39 } 40 sort(app,app+n,cmp); 41 42 43 /*for(i=0;i<n;i++){ 44 cout<<app[i].GE<<" "<<app[i].GI<<" "<<app[i].sum<<endl; 45 }*/ 46 47 48 int schnum; 49 for(i=0;i<n;i++){ 50 for(j=0;j<k;j++){ 51 schnum=app[i].want[j]; 52 if(sch[schnum].size()<school[schnum]||(sum[sch[schnum].back()]==app[i].sum&&GE[sch[schnum].back()]==app[i].GE)){//这里要注意排序后,编号都乱了,编号不再和当前的元素对应 53 sch[schnum].push_back(app[i].num); 54 break; 55 } 56 } 57 } 58 vector<int>::iterator it; 59 for(i=0;i<m;i++){ 60 if(sch[i].size()){ 61 sort(sch[i].begin(),sch[i].end()); 62 it=sch[i].begin(); 63 printf("%d",*it); 64 it++; 65 for(;it!=sch[i].end();it++){ 66 printf(" %d",*it); 67 } 68 } 69 printf("\n"); 70 } 71 return 0; 72 }
方法二:
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<stack> 5 #include<set> 6 #include<map> 7 #include<queue> 8 #include<algorithm> 9 using namespace std; 10 struct application{ 11 int GE,GI,sum,num; 12 int want[5]; 13 }; 14 vector<int> sch[105]; 15 application app[40005]; 16 int school[105]; 17 bool cmp(application a,application b){ 18 if(a.sum==b.sum){ 19 return a.GE>b.GE; 20 } 21 return a.sum>b.sum; 22 } 23 bool vis[105];//判断是否之前已经满了 24 int main(){ 25 //freopen("D:\\INPUT.txt","r",stdin); 26 int n,m,k,i,j; 27 scanf("%d %d %d",&n,&m,&k); 28 for(i=0;i<m;i++){ 29 scanf("%d",&school[i]); 30 } 31 for(i=0;i<n;i++){ 32 scanf("%d %d",&app[i].GE,&app[i].GI); 33 app[i].sum=app[i].GE+app[i].GI; 34 app[i].num=i; 35 for(j=0;j<k;j++){ 36 scanf("%d",&app[i].want[j]); 37 } 38 } 39 sort(app,app+n,cmp); 40 41 42 /*for(i=0;i<n;i++){ 43 cout<<app[i].GE<<" "<<app[i].GI<<" "<<app[i].sum<<endl; 44 }*/ 45 int count; 46 for(i=0;i<n;){ 47 queue<int> q; 48 count=0; 49 for(j=i;j<n;j++){ 50 if(app[j].sum==app[i].sum&&app[j].GE==app[i].GE){ 51 q.push(j); 52 count++; 53 } 54 else{ 55 break; 56 } 57 } 58 i=j; 59 int cur; 60 int schnum; 61 int temp; 62 for(j=0;j<k;j++){ 63 memset(vis,false,sizeof(vis)); 64 temp=count; 65 while(temp--){ 66 cur=q.front(); 67 q.pop(); 68 schnum=app[cur].want[j]; 69 if(school[schnum]>0||vis[schnum]){//是因为同等级的人“虚”满,还有名额 70 vis[schnum]=true; 71 school[schnum]--; 72 sch[schnum].push_back(app[cur].num); 73 count--; 74 } 75 else{ 76 q.push(cur); 77 } 78 } 79 } 80 } 81 for(i=0;i<m;i++){ 82 if(sch[i].size()){ 83 sort(sch[i].begin(),sch[i].end()); 84 printf("%d",sch[i][0]); 85 } 86 for(j=1;j<sch[i].size();j++){ 87 printf(" %d",sch[i][j]); 88 } 89 printf("\n"); 90 } 91 return 0; 92 }
pat1080. Graduate Admission (30)
标签:
原文地址:http://www.cnblogs.com/Deribs4/p/4802159.html