蓝桥杯试题集试题总汇(C++)
问题描述
给出n个学生的成绩,将这些学生按成绩排序,排序规则:总分高的在前;总分相同,数学成绩高的在前;总分与数学相同,英语高的在前;总分数学英语都相同,学号小的在前
输入格式
第一行一个正整数n,表示学生人数
接下来n行每行3个0~100的整数,第i行表示学号为i的学生的数学、英语、语文成绩
输出格式
输出n行,每行表示一个学生的数学成绩、英语成绩、语文成绩、学号
按排序后的顺序输出
样例输入
2
1 2 3
2 3 4
样例输出
2 3 4 2
1 2 3 1
数据规模和约定
n≤100
分析
使用C++自带的比较函数sort(),对于sort内部要如何比较,需要自定义比较函数。注意if语句的嵌套。
参考代码
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
struct student//声明结构体
{
int math;
int english;
int chinese;
int id;
};
bool cmp(student stu1,student stu2)//设置比较函数
{
int sum1=stu1.math+stu1.english+stu1.chinese;
int sum2=stu2.math+stu2.english+stu2.chinese;
if(sum1==sum2)
{
if(stu1.math==stu2.math)
{
if(stu1.english==stu2.english)
{
return stu1.id<stu2.id;//总分、数学相同、英语都相同,学号小的在前
}
else
return stu1.english>stu2.english;//总分、数学相同,英语高的在前
}
else
return stu1.math>stu2.math;//总分相同,数学高的在前
}
else
return sum1>sum2;//优先考虑总分成绩,高的在前
}
int main()
{
int n;
cin>>n;
struct student stu[n];
for(int i=0; i<n; i++)
{
cin>>stu[i].math>>stu[i].english>>stu[i].chinese;//输入数据
stu[i].id=i+1;
}
sort(stu,stu+n,cmp);//成绩排序
for(int i=0; i<n; i++)
{
cout<<stu[i].math<<" "<<stu[i].english<<" "<<stu[i].chinese<<" "<<stu[i].id<<endl;//输出数据
}
return 0;
}