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")