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
// 1080pat.cpp : 定义控制台应用程序的入口点。 // #include <iostream> #include <vector> #include <algorithm> #include <functional> using namespace std; const int schools=100; //最多的研究生院个数 vector<int> quota; //每个研究生院的限额 struct App { int num; //申请人编号,从0开始 int GE; int GI; int Final; int rank; //申请人的排名 int choices[5]; bool operator <(const App& rhs) const { if(Final==rhs.Final) { return GE>rhs.GE; } else return Final>rhs.Final; } }; class T:public unary_function<App,bool> //for_each处理,得到每个申请人的相对排名 { public: T(App& aa):app(aa){} bool operator()(App& a) { if(a.Final<app.Final) { a.rank=app.rank+1; } else { if(a.GE<app.GE) { a.rank=app.rank+1; } else a.rank=app.rank; } app=a; return true; } private: App app; }; vector<App> applicants; //所有的申请人 vector<int> res[schools]; //每个研究生院录取的申请人编号 int sranks[schools]; //每个研究生院录取的申请人的当前最新排名,用来处理case4 int main() { int N,M,K; //数据输入 cin>>N>>M>>K; int qbuf; int i; for(i=0;i<M;++i) { cin>>qbuf; quota.push_back(qbuf); } for(i=0;i<N;++i) { App Abuf; //每次定义一个,如果定义到外面的话,在App中要重载operator= cin>>Abuf.GE>>Abuf.GI; Abuf.Final=(Abuf.GE+Abuf.GI)>>1; for(int j=0;j<K;++j) { cin>>Abuf.choices[j]; } Abuf.num=i; applicants.push_back(Abuf); } sort(applicants.begin(),applicants.end()); //排序 applicants[0].rank=1; for_each(applicants.begin(),applicants.end(),T(applicants[0])); //得到相对排名 for(vector<App>::iterator iter=applicants.begin();iter!=applicants.end();++iter) { for(int j=0;j<K;++j) { //每个申请人的申请的第j个研究生院还有名额,或者跟之前录取的有相同的排名 if(quota[iter->choices[j]]>0||sranks[iter->choices[j]]==iter->rank) { --quota[iter->choices[j]]; //研究生院的名额减少一个 res[iter->choices[j]].push_back(iter->num);//将录取的申请人添加到对应的研究生院 sranks[iter->choices[j]]=iter->rank; //更新对应研究生院的最新录取申请人的排名 break; } } } for(i=0;i<M;++i) { int size=res[i].size(); if(0==size) cout<<endl; else { sort(res[i].begin(),res[i].end()); for(int j=0;j<size;++j) { if(0!=j) cout<<" "; cout<<res[i][j]; } cout<<endl; } } return 0; }
PAT 1080. Graduate Admission (30),布布扣,bubuko.com
PAT 1080. Graduate Admission (30)
原文:http://www.cnblogs.com/wwblog/p/3657725.html