qq1508020550 @ 2024-04-10 13:04:22
我看大佬们都说的那个相等输出靠前的那个,我在cmp函数里处理了啊,只有大于才能交换,不就满足了吗,我把数据下载了,输入和输出一样的,不知道为啥过不了。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct student {
string name;
int chinese;
int math;
int english;
};
bool cmp(student a, student b) {
return a.chinese + a.math + a.english >= b.chinese + b.math + b.english;
}
int main() {
int n;
cin >> n;
vector<student> students(n);
for (int i = 0; i < n; ++i) {
cin >> students[i].name >> students[i].chinese >> students[i].math >> students[i].english;
}
sort(students.begin(), students.end(), cmp);
cout << students[0].name << " " << students[0].chinese << " " << students[0].math << " " << students[0].english;
return 0;
}
by Terrible @ 2024-04-10 13:19:20
@qq1508020550
①STL 要求排序关系满足严格弱序 ,不可以出现两者相等返回真的情况,因为这会导致 True==cmp(a,b)==cmp(b,a)
,在 STL 的理解之下是 a<b
且 b<a
,没给你 RE 掉已经非常仁慈了。
②std::sort
不是你想象中的那种插入排序或者冒泡排序,不一定邻项交换,至于相等保持原顺序,详见排序的稳定性。std::sort
提供的是一个不稳定的排序,而 std::stable_sort
才提供了一个稳定的排序。
③为了适应更多情况,请写代码的时候不必考虑使用 std::stable_sort
还是 std::sort
,直接将相等时使用的顺序写到结构体中,或者用结构体的元素推出相等时的顺序,然后在 cmp
中写明相等时的大小排序。
by Terrible @ 2024-04-10 13:22:02
至于③,你可以看看这篇题解。
by qq1508020550 @ 2024-04-10 21:43:02
@Terrible 谢谢大佬
by ss2315zjx @ 2024-04-13 15:22:36
s 你个sb(傻逼)