1080. Graduate Admission (30)

来源:互联网 发布:凉宫春日 知乎 编辑:程序博客网 时间:2024/06/10 13:34

    在处理超出学校名额的情况仍然有可能录取的情况时,为每个学校加入一个变量以指示最后一个录入同学的排名,当后来的同学与这个排名相同时则不再考虑是否名额不够。

#include <iostream>#include <cstdio>#include <vector>#include <algorithm>using namespace std;struct School{int quota;int rank;  // the last one's rankvector<int> admits;School() : quota(0), rank(-1){}};struct Student{int id, ge, gi, final, rank;vector<int> choices;Student(int id, int ge, int gi, vector<int> c) : id(id), ge(ge), gi(gi), final((ge+gi)/2), choices(c){}bool operator < (const Student& rhs) const{if(final != rhs.final) return final > rhs.final;else return ge > rhs.ge;}};int main(){int n, m, k;scanf("%d%d%d", &n, &m, &k);vector<School> schools(m);for(int i = 0; i < m; ++i){scanf("%d", &schools[i].quota);}vector<Student> stus;for(int i = 0; i < n; ++i){int ge, gi;vector<int> c(k);scanf("%d%d", &ge, &gi);for(int j = 0; j < k; ++j){scanf("%d", &c[j]);}stus.emplace_back(i, ge, gi, c);}sort(begin(stus), end(stus));for(size_t i = 0; i < stus.size(); ++i){if(i == 0) stus[i].rank = 1;else{if(stus[i].final == stus[i-1].final && stus[i].ge == stus[i-1].ge){stus[i].rank = stus[i-1].rank;}else{stus[i].rank = i+1;}}}for(auto& s : stus){for(auto& c : s.choices){if(schools[c].quota > 0 || schools[c].rank == s.rank){schools[c].admits.push_back(s.id);schools[c].quota--;schools[c].rank = s.rank;break;}}}for(auto& s : schools){sort(begin(s.admits), end(s.admits));bool first = true;for(auto& a : s.admits){if(first) first = false;else printf(" ");printf("%d", a);}printf("\n");}return 0;}


0 0