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



京公网安备 11010502036488号