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 81 4
简单排序然后模拟操作就好了。
#include<cstdio> #include<vector> #include<cstring> #include<algorithm> using namespace std; const int maxn = 1e5 + 10; int n, m, k, ans[maxn]; int c[maxn][5], g[maxn][2], cnt[maxn]; vector<int> s[maxn]; bool cmp(const int &x, const int &y) { return g[x][1] == g[y][1] ? g[x][0] > g[y][0]:g[x][1] > g[y][1]; } bool equ(const int &x, const int &y) { return g[x][0] == g[y][0] && g[x][1] == g[y][1]; } int main() { scanf("%d%d%d", &n, &m, &k); for (int i = 0; i < m; i++) scanf("%d", &cnt[i]); for (int i = 0; i < n; i++) { scanf("%d", &g[i][0]); scanf("%d", &g[i][1]); g[i][1] += g[i][0]; for (int j = 0; j < k; j++) scanf("%d", &c[i][j]); ans[i] = i; } sort(ans, ans + n, cmp); for (int i = 0; i < n; i++) { for (int j = 0; j < k; j++) { int x = c[ans[i]][j]; if (s[x].size() < cnt[x] || equ(s[x][s[x].size() - 1], ans[i])) { s[x].push_back(ans[i]); break; } } } for (int i = 0; i < m; i++) { sort(s[i].begin(), s[i].end()); for (int j = 0; j < s[i].size(); j++) { printf("%s%d", j ? " " : "", s[i][j]); } printf("\n"); } return 0; }