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<cstdio> #include<vector> #include<algorithm> #define MAX 105 using namespace std; typedef struct Stu { int num; int Ge; int Gi; int choice[5]; int rank; }Stu; int cmp(const Stu &l,const Stu &r) { if(l.Ge+l.Gi==r.Ge+r.Gi) return l.Ge>r.Ge; else return l.Ge+l.Gi>r.Ge+r.Gi; } int main(int argc,char *argv[]) { int n,m,k; int Quota[MAX]; int Rankmark[MAX]; vector<int> Admit[MAX]; int i,j; vector<Stu> v; scanf("%d%d%d",&n,&m,&k); for(i=0;i<m;i++) scanf("%d",&Quota[i]); for(i=0;i<n;i++) { Stu temp; temp.num=i; scanf("%d%d",&temp.Ge,&temp.Gi); for(j=0;j<k;j++) scanf("%d",&temp.choice[j]); v.push_back(temp); } sort(v.begin(),v.end(),cmp); int sum1,sum2; v[0].rank=1; sum1=v[0].Ge+v[0].Gi; for(i=1;i<n;i++) { sum2=v[i].Ge+v[i].Gi; if(sum2<sum1) v[i].rank=v[i-1].rank+1; else if(sum2==sum1&&v[i].Ge<v[i-1].Ge) v[i].rank=v[i-1].rank+1; else if(sum2==sum1&&v[i].Ge==v[i-1].Ge) v[i].rank=v[i-1].rank; sum1=sum2; } for(i=0;i<n;i++) { for(j=0;j<k;j++) { int index=v[i].choice[j]; if(Admit[index].size()<Quota[index]) { Admit[index].push_back(v[i].num); Rankmark[index]=v[i].rank; break; } else if(v[i].rank==Rankmark[index]) { Admit[index].push_back(v[i].num); break; } } } for(i=0;i<m;i++) { sort(Admit[i].begin(),Admit[i].end()); if(Admit[i].size()==0) printf("\n"); else { for(j=0;j<Admit[i].size();j++) { if(j==0) printf("%d",Admit[i][j]); else printf(" %d",Admit[i][j]); } printf("\n"); } } return 0; }AC代码:(二)不用计算出排名
#include<cstdio> #include<vector> #include<algorithm> #define MAX 105 using namespace std; typedef struct Stu { int num; int Ge; int Gi; int choice[5]; }Stu; int cmp(const Stu &l,const Stu &r) { if(l.Ge+l.Gi==r.Ge+r.Gi) return l.Ge>r.Ge; else return l.Ge+l.Gi>r.Ge+r.Gi; } int main(int argc,char *argv[]) { int n,m,k; int Quota[MAX]; int Vacancy[MAX]; vector<int> Admit[MAX]; Stu s[40005]; int i,j; vector<Stu> v; scanf("%d%d%d",&n,&m,&k); for(i=0;i<m;i++) { scanf("%d",&Quota[i]); Vacancy[i]=Quota[i]; } for(i=0;i<n;i++) { Stu temp; temp.num=i; scanf("%d%d",&temp.Ge,&temp.Gi); for(j=0;j<k;j++) scanf("%d",&temp.choice[j]); v.push_back(temp); s[i]=temp; } sort(v.begin(),v.end(),cmp); for(i=0;i<n;i++) { for(j=0;j<k;j++) { int index=v[i].choice[j]; if(Vacancy[index]>=1) { Admit[index].push_back(v[i].num); Vacancy[index]--; break; } else if(Vacancy[index]==0) { int t=Admit[index].back(); if(s[t].Ge+s[t].Gi==v[i].Ge+v[i].Gi&&v[i].Ge==s[t].Ge) { Admit[index].push_back(v[i].num); break; } } } } for(i=0;i<m;i++) { sort(Admit[i].begin(),Admit[i].end()); if(Admit[i].size()==0) printf("\n"); else { for(j=0;j<Admit[i].size();j++) { if(j==0) printf("%d",Admit[i][j]); else printf(" %d",Admit[i][j]); } printf("\n"); } } return 0; }
Pat(Advanced Level)Practice--1080(Graduate Admission),布布扣,bubuko.com
Pat(Advanced Level)Practice--1080(Graduate Admission)
原文:http://blog.csdn.net/cstopcoder/article/details/22432099