3376.成绩排序2
⭐️难度:简单
⭐️类型:排序
📖题目:题目链接

🌟思路:
1、排序要参考2个元素,所以要自定义一个学生类型;
2、考察自定义排序规则:
找出 不交换 的情况:
①题目要求成绩由低向高排,所以左成绩 < 右成绩时,不交换;
②题目要求成绩相等时,学号由小到大排,所以左成绩 = 右成绩 且 左学号 < 右学号时,不交换。
📚题解:
cpp
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<vector> // vector不需要.h
#include<list>
#include<set> // // 可以用 set 和 multiset
#include<unordered_set> // 可以用 unordered_set 和 unordered_multimap
#include<map> // 可以用 map 和 multimap
#include<unordered_map> // 可以用 unordered_map 和 unordered_multimap
#include<algorithm>
using namespace std;
struct Student {
int number;
int score;
};
bool compare(Student lhs, Student rhs) { // 参数类型和 "容器的元素的类型"一致
if (lhs.score < rhs.score) { // 左成绩 < 右成绩,不交换
return true;
}
else if (lhs.score == rhs.score && lhs.number < rhs.number) { // 左成绩 = 右成绩 且 左学号 < 右学号,不交换
return true;
}
else {
return false;
}
}
int main() {
int n;
scanf("%d", &n);
vector<Student> vec(n);
for (int i = 0;i < n;i++) {
scanf("%d%d", &vec[i].number, &vec[i].score);
}
sort(vec.begin(), vec.end(), compare);
for (int i = 0;i < n;i++) {
printf("%d %d\n", vec[i].number, vec[i].score);
}
return 0;
}