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 <iostream> #include <vector> #include <algorithm> using namespace std; int n, m, k; vector<int> school_quota; vector<vector<int>> school_admit; int adm_rank[101]; struct STU { int index; int GE, Gi; int rank; int appli[5]; int adm; STU():adm(-1){} }stu[40001]; bool cmp(STU a, STU b) { int fa = (a.GE + a.Gi) / 2; int fb = (b.GE + b.Gi) / 2; if (fa != fb) { return fa > fb; } else return a.GE > b.GE; } int main() { cin >> n >> m >> k; int temp; for (int i = 0; i < m; i++) { cin >> temp; school_quota.push_back(temp); } for (int i = 0; i < n; i++) { cin >> stu[i].GE >> stu[i].Gi; for (int j = 0; j < k; j++) cin >> stu[i].appli[j]; stu[i].index = i; } sort(stu, stu + n, cmp); stu[0].rank = 0; for (int i = 1; i < n; i++) { if (stu[i].GE == stu[i - 1].GE &&stu[i].Gi == stu[i - 1].Gi) stu[i].rank = stu[i - 1].rank; else stu[i].rank = i; } school_admit.resize(m); for (int i = 0; i < n; i++) { for (int j = 0; j < k; j++) { if (school_quota[stu[i].appli[j]] > 0) { if (stu[i].adm != -1) break; school_admit[stu[i].appli[j]].push_back(stu[i].index); stu[i].adm = stu[i].appli[j]; school_quota[stu[i].appli[j]]--; if (adm_rank[stu[i].adm] < stu[i].rank) adm_rank[stu[i].adm] = stu[i].rank; break; } //int rank; //for (int a = 0; a < school_admit[stu[i].appli[j]].size(); a++) //{ // rank = stu[school_admit[stu[i].appli[j]][a]].rank; //} if (stu[i].rank <= adm_rank[stu[i].appli[j]])//曾出错,以为和学生排名的上一个比较。其实是录取的上一个,或排名最后的一个。 { if (stu[i].adm != -1) break; school_admit[stu[i].appli[j]].push_back(stu[i].index); stu[i].adm = stu[i].appli[j]; break; } } } for (int i = 0; i < m; i++) { if (school_admit[i].size()) { sort(&school_admit[i][0], &school_admit[i][0] + school_admit[i].size()); cout << school_admit[i][0]; for (int j = 1; j < school_admit[i].size(); j++) { cout << " " << school_admit[i][j]; } cout << endl; } else cout << endl; } }
1 排序会破坏原始顺序,在需要id的时候加入id属性
2 适当的数据结构会大大减少代码复杂性,和出错可能。记录之前的信息。
3 在某些时候对某个关键值不要想当然,或许需要记录下来
4 低级错误,在代码中错误使用常量,而不是变量。
原文:http://www.cnblogs.com/patforjiuzhou/p/7442176.html