标签:
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>
#include <stdio.h>
#pragma warning(disable:4996)
using namespace std;
struct Student
{
int id;
int rank;
int ge;
int gi;
int total;
vector<int> application;
};
struct School
{
int want;
vector<Student> admit;
};
vector<Student> stu;
vector<School> sch;
bool cmp(Student a, Student b) {
if (a.total != b.total)
return a.total > b.total;
else
return a.ge > b.ge;
}
bool cmp2(Student a, Student b) {
return a.id < b.id;
}
int main(void) {
int n, m, k;
cin >> n >> m >> k;
for (int i = 0; i < m; i++) {
School schoolTemp;
cin >> schoolTemp.want;
sch.push_back(schoolTemp);
}
for (int i = 0; i < n; i++) {
Student studenTemp;
cin >> studenTemp.ge;
cin >> studenTemp.gi;
studenTemp.id = i;
studenTemp.total = studenTemp.ge + studenTemp.gi;
int apply = 0;
for (int j = 0; j < k; j++) {
cin >> apply;
studenTemp.application.push_back(apply);
}
stu.push_back(studenTemp);
}
sort(stu.begin(), stu.end(), cmp);
stu[0].rank = 1;
for (int i = 1; i < n; i++) {
if (stu[i].total == stu[i - 1].total&&stu[i].ge == stu[i - 1].ge)
stu[i].rank = stu[i - 1].rank;
else
stu[i].rank = i + 1;
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < k; j++) {
if (sch[stu[i].application[j]].want == 0)
continue;
if (sch[stu[i].application[j]].admit.size() < sch[stu[i].application[j]].want || (sch[stu[i].application[j]].admit.size() >= sch[stu[i].application[j]].want&&sch[stu[i].application[j]].admit[sch[stu[i].application[j]].admit.size() - 1].rank == stu[i].rank)) {
sch[stu[i].application[j]].admit.push_back(stu[i]);
break;
}
}
}
for (int i = 0; i < m; i++) {
if (sch[i].admit.size() == 0) {
cout << endl;
continue;
}
else {
sort(sch[i].admit.begin(), sch[i].admit.end(), cmp2);
cout << sch[i].admit[0].id;
for (int j = 1; j < sch[i].admit.size(); j++) {
printf(" %d", sch[i].admit[j].id);
}
printf("\n");
}
}
return 0;
}
标签:
原文地址:http://www.cnblogs.com/zzandliz/p/5023257.html