C++ sort默认升序,通过lambda表达式,定义两个元素的比较顺序实现自定义排序。

注意参数列表里面是要比较的参数的类型

#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n, m;
    cin >> n >> m;
    vector<vector<int>> ks;
    int nt=n;
    while (nt--) {
        int ki, si;
        cin >> ki >> si;
        vector<int> t;
        t.push_back(ki); t.push_back(si);
        ks.push_back(t);
    }
    sort(ks.begin(), ks.end(), [](const auto &a, const auto &b) {
        // 分数相等则按序号升序排序
        return a[1]==b[1] ? a[0]<b[0] : a[1]>b[1];
    });
    
    int t = 1.5*m;
    t = t<n ? t : n;
    // 所有分数为sort_ks[t-1][1]的均进入面试
    while (t<n && ks[t][1]==ks[t-1][1]) {
        t++;
    }
    cout << ks[t-1][1] << ' ' << t << endl;
    for (int i=0; i<t; i++) {
        cout << ks[i][0] << ' ' << ks[i][1] << endl;
    }
}
// 64 位输出请用 printf("%lld")

通过记录分数位置实现

#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n, m;
    cin >> n >> m;
    vector<vector<int>> ks;
    int nt=n;
    while (nt--) {
        int ki, si;
        cin >> ki >> si;
        vector<int> t;
        t.push_back(ki); t.push_back(si);
        ks.push_back(t);
    }
    // 记录原始位置
    vector<int> idx(ks.size());
    for (int i=0; i<idx.size();++i) {
        idx[i]=i;
    }
    // 按第二列分数值对位置进行降序排序
    sort(idx.begin(), idx.end(), [&](int a, int b) { // [&],表示按引用捕获所有外部变量。
        // 分数相等则按序号升序排序
        return ks[a][1]==ks[b][1] ? ks[a][0]<ks[b][0] : ks[a][1]>ks[b][1];
    });
    // 按位置排序
    vector<vector<int>> sort_ks(ks.size(), vector<int>(2));
    for (int i=0; i<idx.size(); i++) {
        sort_ks[i][0] = ks[idx[i]][0];
        sort_ks[i][1] = ks[idx[i]][1];
    }
    int t = 1.5*m;
    t = t<n ? t : n;
    // 所有分数为sort_ks[t-1][1]的均进入面试
    while (t<n && sort_ks[t][1]==sort_ks[t-1][1]) {
        t++;
    }
    cout << sort_ks[t-1][1] << ' ' << t << endl;
    for (int i=0; i<t; i++) {
        cout << sort_ks[i][0] << ' ' << sort_ks[i][1] << endl;
    }
}
// 64 位输出请用 printf("%lld")