题解 | 分数线划定

分数线划定

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;
}

全部评论

相关推荐

03-06 18:20
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务