题解(详细)
2026-03-31 19:36:30
发布于:浙江
1阅读
0回复
0点赞
问题深度解析
核心规则梳理
面试分数线计算:
计算计划录取人数的150%,向下取整得到排名阈值k = floor(m * 1.5)
面试分数线为第k名选手的分数(从高到低排名)
所有成绩≥面试分数线的选手都进入面试
排序规则:
主要排序键:笔试成绩从高到低
次要排序键:报名号从小到大(成绩相同时)
关键注意事项
成绩相同的选手可能会导致实际进入面试的人数超过k
报名号是唯一的,可以作为成绩相同时的排序依据
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct P { // P表示选手(Participant)
int k; // k表示报名号
int s; // s表示成绩
};
// 自定义排序规则:成绩降序,成绩相同则报名号升序
bool cmp(const P& a, const P& b) {
if (a.s != b.s) return a.s > b.s;
return a.k < b.k;
}
int main() {
int n, m;
cin >> n >> m;
vector<P> ps(n); // ps表示选手列表
for (int i = 0; i < n; ++i) {
cin >> ps[i].k >> ps[i].s;
}
// 按照自定义规则排序
sort(ps.begin(), ps.end(), cmp);
// 计算面试分数线和实际进入面试的人数
int k = m * 3 / 2; // m*1.5向下取整,等价于m*3//2
int cut = ps[k-1].s; // 第k名的成绩(下标从0开始)
// 统计所有成绩≥cut的选手人数
int cnt = 0;
while (cnt < n && ps[cnt].s >= cut) {
cnt++;
}
// 输出结果
cout << cut << " " << cnt << endl;
for (int i = 0; i < cnt; ++i) {
cout << ps[i].k << " " << ps[i].s << endl;
}
return 0;
}
这里空空如也




有帮助,赞一个