90分样例1过不了

P5740 【深基7.例9】最厉害的学生

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<bb<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(傻逼)


|