针对结构体排序问题,分三步走:①声明结构体 ② 重新定义排序规则 ③主函数里面的读数据,利用sort()排序,及根据题意输出
以例题进行讲解:[NOIP2007 普及组] 奖学金 - 洛谷
这道题比较经典,题目较长,但不必害怕!!!
输入:先是输入学生总人数,后面每一行分别代表语文,数学,英语的成绩。
输出 : 输出前5名学生的学号和总分。
①声明结构体,结构体里面定义的变量分别为:语文成绩,数学成绩,英语成绩,题目中还涉及总分,以及学号,故结构体声明如下:
#include
using namespace std;
struct stu{
int id; //学号
int chinese; //语文成绩
int math; //数学成绩
int english; //英语成绩
int score; //总分
};
②重新定义排序规则:依据题意我们可以得知排序规则:
(1)总分从高到低
(2)总分相同时,语文成绩从高到低排
(3)总分和语文成绩相同时,学号小的排在前面。
bool cmp(stu a, stu b){
if(a.score != b.score){ //总分不同时,从高到低排
return a.score > b.score;
}else{ //总分相同时
if(a.chinese != b.chinese){ //语文成绩不同,从高到低排
return a.chinese > b.chinese;
}else{ //总分和语文成绩相同时,学号小的往前排
return a.id < b.id;
}
}
}
③主函数(读,sort排序,输出):
int main(){
int n;
cin >> n;
stu s[n]; //定义结构体数组
for(int i = 0; i < n; i++){
int a, b, c;
cin >> a >> b >> c; //a b c代表语文,数学,英语成绩
int d = a + b + c; //d 代表总分
s[i] = {i+1,a,b,c,d}; //结构体变量里面的每一个分量的值
}
sort(s,s+n,cmp); //利用sort排序
//按照题意进行输出
for(int i = 0; i < 5; i++){
cout << s[i].id << " " << s[i].score << endl;
}
return 0;
}
总代码:
#include
using namespace std;
struct stu{
int id;
int chinese;
int math;
int english;
int score;
};
bool cmp(stu a, stu b){
if(a.score != b.score){
return a.score > b.score;
}else{
if(a.chinese != b.chinese){
return a.chinese > b.chinese;
}else{
return a.id < b.id;
}
}
}
int main(){
int n;
cin >> n;
stu s[n];
for(int i = 0; i < n; i++){
int a, b, c;
cin >> a >> b >> c;
int d = a + b + c;
s[i] = {i+1,a,b,c,d};
}
sort(s,s+n,cmp);
for(int i = 0; i < 5; i++){
cout << s[i].id << " " << s[i].score << endl;
}
return 0;
}
结构体类型的题目其实是简单的,多做几道题目就好,刚开始的时候我也不明白。
在做题过程中,你需知道如何声明结构体,排序规则,以及数据的读取,排序,输出即可。
我上面写的代码是可以作为模板的,按照这个套路写就好。
类题如下:
生日 - 洛谷
[NOIP2009 普及组] 分数线划定 - 洛谷
宇宙总统 - 洛谷 (这道题与其他题有点不同,排序对象是字符串)
[NOIP2005 提高组] 谁拿了最多奖学金 - 洛谷(这道题绕的弯较多,弄清楚排序规则就好)
我把每道题目的代码以单独的文章贴出,大家可以进行一个对比。