【PTA-A】1080 Graduate Admission
题目链接: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;
}

浙公网安备 33010602011771号