蒟蒻80分求助!!!点6点8错了

P1093 [NOIP2007 普及组] 奖学金

Ewan @ 2021-01-08 21:39:55

#include<iostream>
#include<algorithm>
using namespace std;
int n;
struct node{
    int no,c=0,m=0,e=0,total=0;
};
node a[600],c;
bool cmp(node x,node y) {
    if(x.total>y.total)return true;
    else if(x.total==y.total) {
        if(x.c>y.c||x.e>y.e||x.m>y.m) return true;
        else return false;
    }
    else return false;
}
int main() {
    cin>>n;
    for(int i=0;i<n;i++) {
        cin>>a[i].c>>a[i].m>>a[i].e;
        a[i].no=i+1;
        a[i].total=a[i].c+a[i].m+a[i].e;
    }
    sort(a,a+n,cmp);
    for(int i=0;i<5;i++) {
        cout<<a[i].no<<" "<<a[i].total<<endl;
    }
    return 0;
}

by Sakurakouji_Saika @ 2021-02-23 03:17:00

以下是 鄙人 个人的看法,可能存在错误,别骂我,说我错了就行

从 题目 得

每个学生都有3门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学 排在前面

排序规则 为:

  1. 先总分 从大到小
  2. 再语文 从大到小
  3. 最后编号 从小到大

代码

if(x.c>y.c||x.e>y.e||x.m>y.m) return true;

这里我个人的理解是 x.m>y.m 意思是编号大的排在前面。题目要求的是编号小的排在前面.所以改一下 x.m<y.m

if(x.c>y.c||x.e>y.e||x.m<y.m) return true;

by Sakurakouji_Saika @ 2021-02-23 04:15:28

至于 测试点 9

从上面的排序顺序说,其实你这里的

if(x.c>y.c||x.e>y.e||x.m<y.m) return true;

还是改这里,看上面 排序规则 改成

if(x.c>y.c||x.m<y.m) return true;

by Ewan @ 2021-03-19 21:11:20

@Sakurakouji_Saika 好的好的,已经通过了,谢谢


|