PAT 1080. Graduate Admission (平行志愿模拟题)

来源:互联网 发布:海康威视nvr无网络视频 编辑:程序博客网 时间:2024/04/27 08:44

学生总分高的排名在前;

总分相同,GE得分高的排名在前;

GE相同,则排名相同。


注意到,编写<algorithm>里的sort函数所调用的比较函数不能在前两个条件相等时,直接返回true.

知道原理的告诉我声... 我是改成了a.m_number < b.m_number, 即比较学生的id.

friend bool operator< (const Applicant& a, const Applicant& b){int aa = a.m_ge + a.m_gi;int bb = b.m_ge + b.m_gi;if (aa != bb){return aa > bb;} else if (a.m_ge != b.m_ge){return a.m_ge > b.m_ge; } else{return a.m_number < b.m_number; ////// true}}

代码:

#include <cstdio>#include <vector>#include <algorithm>#include <list>using namespace std;struct Applicant{int m_number;int m_ge;int m_gi;list<int> m_choice;friend bool operator== (const Applicant& a, const Applicant& b){return a.m_ge == b.m_ge && a.m_gi == b.m_gi;}friend bool operator< (const Applicant& a, const Applicant& b){int aa = a.m_ge + a.m_gi;int bb = b.m_ge + b.m_gi;if (aa != bb){return aa > bb;} else if (a.m_ge != b.m_ge){return a.m_ge > b.m_ge; } else{return a.m_number < b.m_number; ////// true}}};Applicant applicant[40010];vector<int> school[110];int n, m, k, quota[110];int capacity, ge, gi, choice;void choose_school(int begin, int end){bool full[110];for (int i = 0; i < m; ++ i){full[i] = school[i].size() >= quota[i];}for (int i = begin; i < end; ++ i){for (auto it = applicant[i].m_choice.begin(); it != applicant[i].m_choice.end(); ++ it){if (full[*it] == false){school[*it].push_back( applicant[i].m_number );break;}}}}int main(){scanf("%d%d%d", &n, &m, &k);for (int i = 0; i < m; ++ i){scanf("%d", quota + i);}for (int i = 0; i < n; ++ i){applicant[i].m_number = i;scanf("%d%d", &applicant[i].m_ge, &applicant[i].m_gi);for (int j = 0; j < k; ++ j){scanf("%d", &choice);applicant[i].m_choice.push_back(choice);}}sort(applicant, applicant+n);for (int i = 0; i < n; ){int begin = i;++ i;while (i < n && applicant[i] == applicant[begin]){++ i;}choose_school(begin, i);}for (int i = 0; i < m; ++ i){sort (school[i].begin(), school[i].end());bool first = true;for (size_t j = 0; j < school[i].size(); ++ j){if (first){printf("%d", school[i][j]);first = false;} else{printf(" %d", school[i][j]);}}printf("\n");}return 0;}


0 0
原创粉丝点击