题目内容
问题描述
某年级有 n ( n ≤ 5000 ) n(n \le 5000) n(n≤5000)个学生,学号1到 n n n,现给出这 n n n个学生的语文和数学成绩,请按数学成绩的由高到低对这 n n n个学生进行排序。数学成绩相同的学生,按语文成绩由高到低排序。
输入格式
第一行,一个整数n,表示n个学生
第二行,n个空格间隔的整数,表示学号1到n的学生的数学成绩
第三行,n个空格间隔的整数,表示学号1到n的学生的语文成绩
输出格式
排序后输出 n n n行,每行代表一个学生。
每行两个数字,分为该生的数学和语文成绩。
样例输入
6
67 88 91 88 99 88
80 92 69 70 85 77
样例输出
99 85
91 69
88 92
88 77
88 70
67 80
思路
我们先用一个结构体存储学生信息:
struct student{
int Ch,Math;
}stu[5050];
因为这里 n ≤ 5000 n \le 5000 n≤5000,所以我们开5050的结构体数组。
然后就是输入。注意:这道题先输入数学成绩,再输入语文成绩。不要搞错了哦!
接下来,我们定义排序函数。可爱的 C++ 已经帮我们写好了排序函数——sort
。但是,这道题的排序规则比较复杂,因此我们要自定义排序规则——cmp
函数。
bool cmp(student a,student b){
if(a.Math == b.Math){
return a.Ch > b.Ch;
}
return a.Math > b.Math;
}
于是,sort
函数在比较两个值的时候,他会先调用cmp
函数,问他:“这两个数要调换顺序嘛?”然后cmp
会根据我们定义的规则告诉他答案。
这道题要求我们先比较数学成绩,数学成绩相同,就比较语文成绩。所以,cmp
函数应该像上面那样写。
参考代码
#include<bits/stdc++.h>
using namespace std;
struct student{
int Ch,Math;
}stu[5050];
int n;
bool cmp(student a,student b){
if(a.Math == b.Math){
return a.Ch > b.Ch;
}
return a.Math > b.Math;
}
int main(){
scanf("%d",&n);
for(int i = 1; i <= n; i++){
scanf("%d",&stu[i].Math);
}
for(int i = 1; i <= n; i++){
scanf("%d",&stu[i].Ch);
}
sort(stu+1,stu+1+n,cmp);//输入下标从1开始,所以sort的下标也要从1开始。
for(int i = 1; i <= n; i++){
printf("%d %d\n",stu[i].Math,stu[i].Ch);
}
return 0;
}