PAT打卡第14天 A1080. Graduate Admission (30)

    技术2026-04-16  6

    #pragma warning(disable:4996) #include<iostream> #include<vector> #include<algorithm> using namespace std; /* 题目总结:吐了,总会有这样那样的小问题 题目思路:对所有学生进行排序先,先按照grade,一样时,比较ge,仍一样,说明rank一样 在数组下标问题上浪费了大量的时间 再捋一遍顺序,对vector容器排序后,每个节点应该保存学号index, 从高往下,选学校,有两个条件,如果quota没满,直接进,满了,比较已录取学生的成绩, 如果和其中成绩最差的一样,加入 输出的时候,要按学号升序,之前加入的时候,因为要比较成绩,所以,加入的result中是按APP序号的, 加入到result结果中的应该是APP的序号,但是最后要输出学生的学号, 所以应该用结构体,一个保存APP序号,一个保存原本的学号,这里的APP序号相当于排名 主要就是要区分学号和排名的问题 */ int app_num, sch_num, cho_num; int quota[100]; struct node { int stu_index; int app_index; node(int _s,int _a):stu_index(_s),app_index(_a){} }; vector<node> result[100]; struct app { int ge; int gi; double grade; vector<int> choices; int index; }; vector<app> APP; bool compare(int choice,int index) { if (quota[choice] > 0)return true; else { int size = result[choice].size(); int flag = false; for (int i = 0; i < size; i++) { if (APP[result[choice][i].app_index].grade == APP[index].grade) if (APP[result[choice][i].app_index].ge == APP[index].ge) { flag = true; break; } } return flag; } } bool cmp1(app a1,app a2) { if (a1.grade == a2.grade) return a1.ge > a2.ge; else return a1.grade > a2.grade; } bool cmp2(node a1, node a2) { return a1.stu_index < a2.stu_index; } int main() { int tem_cho, choice; cin >> app_num >> sch_num >> cho_num; for (int i = 0; i < sch_num;i++) { cin >> quota[i]; } app temp_app; for (int i = 0; i < app_num; i++) { temp_app.index = i; cin >> temp_app.ge >> temp_app.gi; temp_app.grade = 1.0*(temp_app.ge + temp_app.gi) / 2; for (int j = 0; j < cho_num; j++) { cin >> tem_cho; temp_app.choices.push_back(tem_cho); } APP.push_back(temp_app); temp_app.choices.clear(); } sort(APP.begin(), APP.end(), cmp1); for (int i = 0; i < app_num; i++) { for (int j = 0; j < cho_num; j++) { choice = APP[i].choices[j]; if (quota[choice] > 0 || compare(choice, i)) { result[choice].push_back(node(APP[i].index,i)); quota[choice]--; break; } } } for (int i = 0; i < sch_num; i++) { int size = result[i].size(); if (size == 0)printf("\n"); else { sort(result[i].begin(), result[i].end(), cmp2); for (int j = 0; j < size; j++) { printf("%d", result[i][j].stu_index); if (j != size - 1)printf(" "); else printf("\n"); } } } system("pause"); return 0; }

     

    Processed: 0.014, SQL: 9