题解 | 分数线划定
分数线划定
https://www.nowcoder.com/practice/2395fa7b6c6e452e8d8310a7cfdbe902
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 定义选手结构体:存储报名号k和成绩s
struct Candidate {
int k; // 报名号
int s; // 笔试成绩
};
// 排序规则:成绩降序,成绩相同则报名号升序
bool cmp(const Candidate& a, const Candidate& b) {
if (a.s != b.s) {
return a.s > b.s; // 成绩高的在前
} else {
return a.k < b.k; // 成绩相同,报名号小的在前
}
}
int main() {
int n, m;
cin >> n >> m; // 读取报名人数n和计划录取人数m
vector<Candidate> candidates(n);
// 读取n个选手的报名号和成绩
for (int i = 0; i < n; ++i) {
cin >> candidates[i].k >> candidates[i].s;
}
// 按规则排序选手
sort(candidates.begin(), candidates.end(), cmp);
// 计算面试名额t = ⌊1.5×m⌋(强制类型转换实现向下取整)
int t = static_cast<int>(1.5 * m);
// 确定分数线:取第t名的成绩(索引t-1,若t>n则取最后一名)
int idx = min(t - 1, n - 1);
int line = candidates[idx].s;
// 统计进入面试的人数(成绩≥分数线)
int cnt = 0;
for (const auto& c : candidates) {
if (c.s >= line) {
cnt++;
} else {
break; // 排序后后续成绩均更小,直接终止
}
}
// 输出结果
cout << line << " " << cnt << endl;
for (int i = 0; i < cnt; ++i) {
cout << candidates[i].k << " " << candidates[i].s << endl;
}
return 0;
}
