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 G~E~, and the interview grade G~I~. The final grade of an applicant is (G~E~ + G~I~) / 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 G~E~ and G~I~, 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
思路:
每个考生有两个成绩:GE和GI,最终成绩为(GE + GI) / 2;按照最终成绩排名,如果最终成绩相同,就按照GE排名,如果仍然相同,他们的排名就是相同的。每个申请者有K个选择院校,每个学校也有招生人数限制。按照排名先后,如果当前考生的第一个志愿学校的名额还没满,就录取进去;如果当前志愿名额满了但是该校最后一个录取的人的排名和当前考生相同,则不管招生人数限制,依旧应该被录取;否则考虑该生的下一个志愿。如果所有志愿都没有能被录取,则该生落榜。
C++:
#include
#include
#include
using namespace std;
int n, m, k;
struct stu {
int id, GE, GI, Grade, rank;
vector vSchool;
};
struct sch {
int nowNum, maxNum, lastRank;
vector stuID;
};
bool cmp1(stu a, stu b) {
return a.Grade != b.Grade ? a.Grade > b.Grade : a.GE > b.GE;
}
int main() {
scanf("%d%d%d", &n, &m, &k);
vector student(n);
vector school(m);
for(int i = 0; i < m; i++) {
int temp;
scanf("%d", &temp);
school[i] = {0, temp, -1};
}
for(int i = 0; i < n; i++) {
student[i].vSchool.resize(k);
student[i].id = i;
scanf("%d%d", &student[i].GE, &student[i].GI);
student[i].Grade = (student[i].GE + student[i].GI) / 2;
for(int j = 0; j < k; j++) {
int temp;
scanf("%d", &temp);
student[i].vSchool[j] = temp;
}
}
sort(student.begin(), student.end(), cmp1);
student[0].rank = 1;
for(int i = 1; i < n; i++) {
if(student[i].Grade == student[i - 1].Grade && student[i].GE == student[i - 1].GE)
student[i].rank = student[i-1].rank;
else
student[i].rank = i;
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < k; j++) {
int schoolID = student[i].vSchool[j];
int myRank = student[i].rank;
int myID = student[i].id;
if(school[schoolID].nowNum < school[schoolID].maxNum || school[schoolID].lastRank == myRank) {
school[schoolID].nowNum++;
school[schoolID].lastRank = myRank;
school[schoolID].stuID.push_back(myID);
break;
}
}
}
for(int i = 0; i < m; i++) {
sort(school[i].stuID.begin(), school[i].stuID.end());
for(int j = 0; j < school[i].stuID.size(); j++) {
if(j != 0) printf(" ");
printf("%d", school[i].stuID[j]);
}
printf("\n");
}
return 0;
}