标签:ring ati nts 表示 ice class ++ code exce
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
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn=40010; struct Student{ int GE, GI, sum; //初试成绩,面试成绩,成绩总合 int r, stuID; //总排名,考号(stu[]按成绩排序前的初始编号)设:排序后的称为编号 int choice[6]; //k个志愿学校的编号 }stu[maxn]; struct School{ int quota; //该校招生人数总额 int stuNum; //当前实际招生人数 int id[maxn]; //招收的考生编号 int lastAdmint; //记录最后一个招收的考生编号(即实际招收的考生数) }sch[110]; bool cmpStu(Student a, Student b){ if(a.sum != b.sum) return a.sum>b.sum; //按总分从高到低排序 else return a.GE>b.GE; //总分相同,按GE从高到低排序 } bool cmpID(int a, int b){ return stu[a].stuID < stu[b].stuID; //按考生初始ID从小到大排序 } int main() { int n, m, k; scanf("%d%d%d", &n, &m, &k); //考生人数,学校数,每人可申请的学校数 //初始化每个学校 for(int i=0; i<m; i++){ scanf("%d", &sch[i].quota); //输入招生人数总额度 sch[i].stuNum=0; //当前实际招生人数初始化为0 sch[i].lastAdmint=-1; //最后一个招收的学生编号初始化为-1,表示不存在(未招收) } //初始化每个考生 for(int i=0; i<n; i++){ stu[i].stuID=i; //考生初始ID为i (0->n-1) scanf("%d%d", &stu[i].GE, &stu[i].GI); //初试成绩,面试成绩 stu[i].sum = stu[i].GE+stu[i].GI; //总成绩 for(int j=0; j<k; j++) scanf("%d", &stu[i].choice[j]); //该生申请的k个学校的编号 } //给n个考生按成绩排序 sort(stu, stu+n, cmpStu); //计算每个考生的排名 for(int i=0; i<n; i++){ //若该考生与前面一个考生总分和初试成绩都相同,则排名也相同 if(i>0 && stu[i].sum==stu[i-1].sum && stu[i].GE==stu[i-1].GE) stu[i].r=stu[i-1].r; else stu[i].r=i; } //枚举每个考生i,判断其会被哪所学校录取 (此处及以下的i为考生编号) for(int i=0; i<n; i++){ for(int j=0; j<k; j++){ //枚举考生i的k个志愿学校 int cho = stu[i].choice[j]; //暂存考生i的第j个志愿学校的编号 int num = sch[cho].stuNum; //志愿学校当前的实际招生人数(下一个录取的考生编号从num开始 int last = sch[cho].lastAdmint; //志愿学校最后一个录取的考生编号 //如果人数未满 or 该校最后一个录取的考生stu[last]存在 //即该校有招生:最后一个录取的考生编号!=-1 //且与当前待判定的考生stu[i]排名相同 if( num<sch[cho].quota || (last!=-1 && stu[i].r==stu[last].r) ){ //录取该考生 sch[cho].id[num]=i; //将第一次排序后各考生的编号记录在 sch[cho].id[num]中 sch[cho].lastAdmint=i; //该学校最后一个录取的考生变为i sch[cho].stuNum++; //当前招生人数+1 break; } } } //对m所学校的招生情况进行输出 for(int i=0; i<m; i++){ if(sch[i].stuNum>0){ //如果有招到学生 //在sch[i].id[stuNum]即该校招入的学生范围内,按这些学生的初始ID从小到大排序 sort(sch[i].id, sch[i].id+sch[i].stuNum, cmpID); //输出该校招入学生的初始ID for(int j=0; j<sch[i].stuNum; j++){ //sch[i].id[j]为考生编号(排序后) //stu[sch[i].id[j]].stuID为考号(排序前的初始编号) printf("%d", stu[sch[i].id[j]].stuID); if(j<sch[i].stuNum-1) //格式输出 printf(" "); } } printf("\n"); } return 0; }
PAT(A) 1080. Graduate Admission (30)
标签:ring ati nts 表示 ice class ++ code exce
原文地址:http://www.cnblogs.com/claremore/p/6549790.html