麻烦各位神仙们看看!

P1093 [NOIP2007 普及组] 奖学金

jyz120609 @ 2022-08-05 10:45:28

为什么我Dev-c++样例没问题,但是到洛谷只有60分?麻烦大佬们看看,给点指导,谢谢!

#include <bits/stdc++.h>
using namespace std;
struct node {
    int z;
    int ch;
    int ma;
    int en;
} a[99999];
bool cmp(node x,node y) {
    if(x.ch+x.ma+x.en!=y.ch+y.ma+y.en) return x.ch+x.ma+x.en>y.ch+y.ma+y.en;
    else return x.z>y.z;
}
int main() {
    int n,i;
    cin>>n;
    for(i=1; i<=n; i++) {
        cin>>a[i].ch>>a[i].ma>>a[i].en;
        a[i].z=i;
    }
    sort(a+1,a+n+1,cmp);
    for(i=1; i<=5; i++)
        cout<<a[i].z<<" "<<a[i].ch+a[i].ma+a[i].en<<endl;
}

by flame_soul @ 2022-08-05 10:54:19

@jyz120609 总分相同是先按语文排的


by 野生小卒 @ 2022-08-05 10:55:06

先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学 排在前面

你排序函数不太对


by __er @ 2022-08-05 11:20:58

@jyz120609 我一般这么写,详细点,不容易错,好排查,return 1;表示交换,return 0;表示不交换:

struct stu {
    int ch, en, ma, num, tot;
} a[301];

bool cmp(stu a, stu b) {
    if (a.tot > b.tot) {
        return 1;
    }
    if (a.tot == b.tot && a.ch > b.ch) {
        return 1;
    }
    if (a.tot == b.tot && a.ch == b.ch && a.num < b.num) {
        return 1;
    }
    return 0;
}

by jyz120609 @ 2022-08-05 11:31:37

@野生小卒 谢谢!


by jyz120609 @ 2022-08-05 11:32:03

@flame_soul 谢谢!


by jyz120609 @ 2022-08-05 11:32:29

@__er 谢谢!


|