PAT 甲级 1080 Graduate Admission
#include<bits/stdc++.h>
using namespace std;
int N, M, K;
struct Student
{
int id_;
int grade_e_;
int grade_i_;
double final_grade_;
int rank_;
vector<int> school_want_to_go_;
};
bool cmp(const Student &lhs, const Student &rhs)
{
if (abs(lhs.final_grade_ - rhs.final_grade_) > 1e-6) {
return lhs.final_grade_ - rhs.final_grade_ > 1e-6;
}
if (lhs.grade_e_ != rhs.grade_e_) {
return lhs.grade_e_ > rhs.grade_e_;
}
return lhs.id_<rhs.id_;
}
int main()
{
#ifdef LOCAL
freopen("input.txt", "r", stdin);
#endif
cin >> N >> M >> K;
vector<int> school_quota(M);
for (auto &i : school_quota) cin >> i;
vector<Student> all_student(N);
for (int i = 0; i < N; ++i) {
all_student[i].id_ = i;
cin >> all_student[i].grade_e_ >> all_student[i].grade_i_;
all_student[i].school_want_to_go_ = vector<int>(K);
for (auto &j: all_student[i].school_want_to_go_){
cin >> j;
}
all_student[i].final_grade_ = (all_student[i].grade_e_ + all_student[i].grade_i_) / 2;
}
sort(all_student.begin(), all_student.end(), cmp);
int rank_ctr = -1;
for (int i = 0; i < all_student.size(); ++i) {
if (i == 0) all_student[i].rank_ = ++rank_ctr;
else if (abs(all_student[i].final_grade_ - all_student[i - 1].final_grade_) < 1e-6
&& all_student[i].grade_e_ == all_student[i - 1].grade_e_) {
all_student[i].rank_ = rank_ctr;
}
else {
all_student[i].rank_ = ++rank_ctr;
}
}
vector<vector<Student>> luqu(rank_ctr+1);
for (auto &i : all_student) {
luqu[i.rank_].push_back(i);
}
vector<vector<int>> school_set(M);
for (auto &this_turn : luqu) {
vector<int> school_admit_this_turn(M,0);
for (auto &this_student : this_turn) {
for (auto &school_wannnt : this_student.school_want_to_go_) {
if (school_quota[school_wannnt] > 0) {
school_admit_this_turn[school_wannnt]++;
school_set[school_wannnt].push_back(this_student.id_);
break;
}
}
}
for (int i = 0; i < M; ++i) {
school_quota[i] -= school_admit_this_turn[i];
}
}
for (auto &i : school_set) {
sort(i.begin(), i.end());
}
for (auto &i : school_set) {
for (int j = 0; j < i.size(); ++j) {
if (j != 0) cout << " ";
cout << i[j];
}
cout << endl;
}
}