先给题目上链接: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;
}
}
}
到此,此篇文章就结束了。