做 洛谷p1093 奖学金 对cmp的有解,

先给题目上链接:P1093 [NOIP2007 普及组] 奖学金 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题目的描述是这样的,

先输入一个N,表示一共有多少名学生,那么这些学生的学号从1开始,一直到N;

我们需要按学号顺序(1,2,3,4,......n)  输入一个学生的语文,数学,英语成绩。

然后对这些学生进行排序,排序的约束是:

1,总成绩高的排在前面

2,总成绩相同语文成绩高的站在前面

3.两者都相同的学号小的排在前面。

做这题有很多种方法,我只描述sort(a+1,a+n+1,cmp)的方法;

首先构建一个结构体:

struct student {
    int chinese, math, english ,  id , total;
}a[MAXN];

然后输入各科成绩,赋值学号,总成绩:

int n;
cin >> n;
for (int i = 1; i <= n; i++)
{
    cin >> a[i].chinese >> a[i].english >> a[i].math ;
    a[i].id = i;
    a[i].total = a[i].chinese + a[i].english + a[i].math;
}

写一个sort:

sort(a+1,a+n+1,cmp);

为sort写一个cmp:

bool cmp(student a, student b)
{
    if (a.total != b.total)  return a.total > b.total;
    if (a.chinese != b.chinese)  return a.chinese > b.chinese;
    if (a.id != b.id)  return a.id < b.id;

}

划重点了,这一坨东西是什么意思呢,其实,可以把cmp理解成一个询问的函数,如果这个函数返回的bool值是ture,那么证明(student a, student b) 的排序顺序是对的,就不改变排序顺序了。

如果返回的bool是false,那么就说明排序顺序是错的,就会反过来排序,所以我们返回一个逻辑运算符,a.total > b.total 如果 正确,说明括号里的顺序是对的,如果错误,就会把括号里的顺序反过来。

这坨函数可以写成更容易看懂的形式:

bool cmp(student a, student b)
{
        if (a.total > b.total) return 1;
        else if (a.total < b.total) return 0;
        else
        {
            if (a.chinese > b.chinese) return 1;
            else if (a.chinese < b.chinese) return 0;
            else
            {
                if (a.id > b.id) return 0;
                else return 1;
            }
       }
}

到此,此篇文章就结束了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

louisdlee.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值