【PTA-A】1080 Graduate Admission(不能使用cin)

mac2022-06-30  112

题目链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805387268571136

测试点全过。首先这道题不能使用cin输入,不然第五个测试点是会超时的。然后依然坑点比较多,调了挺久的bug。有几个题目的解读要注意一下。

注意点

1.题意是要按照考生名次录取,一志愿不行继续看他的二志愿。有一些兄弟(比如我)可能一开始会理解成全部先看一志愿,再看二,这样还更麻烦了一点。

2.如果名次相同(总分和ge相同),学校可以破额录取。所以记录一下前一位录取的排名,如果后一位的排名一样,学校也会招收的

3.录取考生编号从小到大排序

4.一个学校没有录取任何学生也要输出换行符。

思路

1.定义两个结构体学校和考生。

考生:id、Ge、Gi、总分total、排名、目标院校choose[5]。

学校:拟录取人数minge、当前录取人数cur_num、录取考生编号数组cur[100001]、录取前一个排名low(默认是0)。

2.cmp函数:先按分数从大到小,再按ge从大到小

3.输入学校名额,输入学生成绩和选择院校,这里保存一下id和总分(因为id后面排序会变)。

4.排序,设置排名

5.学校录取。双层循环,考生一环,目标院校一环。当学校当前录取小于拟录取人数,就直接录取,更新一下学校当前录取考生的名次和录取人数。如果和前一个录取的考生排名相等,也被录取,更新一下录取人数。

6.输出。输出之前要对学校录取的考生序号从小到大排序,如果没有录取也要输出换行。然后注意空格。

#include<iostream> #include<algorithm> using namespace std; struct Student { int ge, gi, id; double total; int choose[5]; int paiming; }stu[40005]; struct School { int minge; int cur_num = 0; int cur[100001]; int low = 0; }sch[105]; bool cmp(Student a, Student b) { if (a.total != b.total)return a.total > b.total; else return a.ge > b.ge; } int main() { int n, m, k; cin >> n >> m >> k; //拟录取人数 for (int i = 0; i < m; i++)scanf_s("%d", &sch[i].minge); //学生信息 for (int i = 0; i < n; i++) { scanf_s("%d %d", &stu[i].ge, &stu[i].gi); stu[i].id = i; stu[i].total = (stu[i].ge + stu[i].gi)*1.0 / 2; for (int j = 0; j < k; j++) scanf_s("%d", &stu[i].choose[j]); } //排序 sort(stu, stu + n, cmp); //排名 stu[0].paiming = 1; int temp = 1; for (int i = 1; i < n; i++) { if (stu[i].total == stu[i - 1].total&&stu[i].ge == stu[i - 1].ge) { stu[i].paiming = stu[i - 1].paiming; temp++; } else stu[i].paiming = ++temp; } //学校录取 for (int i = 0; i < n; i++) { for (int j = 0; j < k; j++) { //temp存储一下学生当前选择的学校 int temp = stu[i].choose[j]; //这里的两个break不要忘了 //学校有名额直接录取 if (sch[temp].cur_num < sch[temp].minge) { sch[temp].cur[sch[temp].cur_num++] = stu[i].id; sch[temp].low = stu[i].paiming; break; } //如果排名相等破例录取 else if (stu[i].paiming == sch[temp].low) { sch[temp].cur[sch[temp].cur_num++] = stu[i].id; break; } } } //输出 for (int i = 0; i < m; i++) { if (sch[i].cur_num > 1) { int temp = sch[i].cur_num; sort(sch[i].cur, sch[i].cur + temp); } for (int j = 0; j < sch[i].cur_num; j++) { cout << sch[i].cur[j]; if (j != sch[i].cur_num - 1)cout << " "; } cout << endl; } return 0; }

 

最新回复(0)