第一次使用对sort编写cmp函数,但不知道哪里有问题,求各位帮忙看一下

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

HIT2023112282 @ 2023-10-17 20:22:53

#include<bits/stdc++.h>
using namespace std;
struct Stu
{
    string name;
    int chi,math,eng;
    int sum;
}a[1010];
bool cmp(Stu x,Stu y)
{
    return x.sum>=y.sum;
}
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i].name>>a[i].chi>>a[i].math>>a[i].eng;
        a[i].sum=a[i].chi+a[i].eng+a[i].math;
    }
    sort(a+1,a+1+n,cmp);
    cout<<a[1].name<<" "<<a[1].chi<<" "<<a[1].math<<" "<<a[1].eng;
    return 0;
}

by Pitiless_boy @ 2023-10-17 20:25:18

@ HIT2023112282如果有多个总分相同的学生,输出靠前的那位


by Pitiless_boy @ 2023-10-17 20:25:51

@HIT2023112282


by Pitiless_boy @ 2023-10-17 20:29:06

所以要改成这样:

#include<bits/stdc++.h>
using namespace std;
struct Stu {
    string name;
    int chi, math, eng;
    int sum, id;//id 存编号 
} a[1010];

bool cmp(Stu x, Stu y) {
    return (x.sum > y.sum) || ((x.sum == y.sum) && (x.id < y.id));// 总分多的排前面,总分一样编号小的排前面。 
}

int main() {
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i].name >> a[i].chi >> a[i].math >> a[i].eng;
        a[i].sum = a[i].chi + a[i].eng + a[i].math;
        a[i].id = i;
    }
    sort(a + 1, a + 1 + n, cmp);
    cout << a[1].name << " " << a[1].chi << " " << a[1].math << " " << a[1].eng;
    return 0;
}

by Kazeno_Akina @ 2023-10-17 20:30:00

我记得cmp是要求绝对顺序的,也就是不能a>b且b>a。

所以要改成>号罢?不然就是乱七八糟了。


by Wanderer_01 @ 2023-10-17 20:31:49

@DoraYaoxy

这个是没关系的。


by Kazeno_Akina @ 2023-10-17 20:33:06

@Wanderer_01 分班考试有个同学因为这么写最小生成树就挂来着,我记得是。


by Argvchs @ 2023-10-17 20:35:49

@Wanderer_01 但是确实是有关系的

https://zh.cppreference.com/w/cpp/algorithm/sort

https://zh.cppreference.com/w/cpp/named_req/Compare

类型要求

  • Compare 必须符合比较 (Compare) 的要求。

建立具有下列性质的严格弱序关系

对于所有 a,comp(a,a)==false

comp(a,b)==truecomp(b,a)==false

comp(a,b)==truecomp(b,c)==truecomp(a,c)==true


by Wanderer_01 @ 2023-10-17 20:41:46

(x.sum > y.sum) || ((x.sum == y.sum) && (x.id < y.id))

这应该是两种不同的关键字吧。


by Pitiless_boy @ 2023-10-17 20:45:01

@Wanderer_01 双关排序啊?没问题吧


by HIT2023112282 @ 2023-10-18 20:50:33

@Pitiless_boy 用了id加上排序确实可以过了


| 下一页