题目大意:
给出N个考生的准考证号、姓名、分数,并输入参数C,要求按C的不同取值进行排序:
- C= 1,则按准考证号从小到大排序。
- C= 2,则按姓名字典序从小到大排序;若姓名相同,则按准考证号从小到大排序。
- C= 3,则按分数从小到大排序;若分数相同,则按准考证号从小到大排序。
算法思路:
常规排序题,使用结构体Student存储学生信息,在排序函数中根据C的取值不同选择不同的排序方式。
排序函数如下cmp函数:
bool cmp(Student a,Student b){
if (C==1){
// 根据id排序
return a.id<b.id;
} else if (C==2){
// 根据name排序
if (a.name!=b.name){
return a.name<b.name;
} else {
return a.id<b.id;
}
} else {
if (a.grade!=b.grade){
// 根据分数排序
return a.grade<b.grade;
} else {
return a.id<b.id;
}
}
}
提交结果:
注意点
最后的一组数据使用cin、cout可能会超时
AC代码
#include<cstdio>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
int N,C; // 记录数目和待排序的列
struct Student{
int id;
string name;
int grade;
};
vector<Student> students;// 学生的记录集合
bool cmp(Student a,Student b){
if (C==1){
// 根据id排序
return a.id<b.id;
} else if (C==2){
// 根据name排序
if (a.name!=b.name){
return a.name<b.name;
} else {
return a.id<b.id;
}
} else {
if (a.grade!=b.grade){
// 根据分数排序
return a.grade<b.grade;
} else {
return a.id<b.id;
}
}
}
int main(){
scanf("%d %d",&N,&C);
Student student;
char name[20];
for (int i = 0; i < N; ++i) {
scanf("%d %s %d",&student.id,name,&student.grade);
student.name = name;
students.push_back(student);
}
sort(students.begin(),students.end(),cmp);
// 输出所有的学生信息
for (int j = 0; j < students.size(); ++j) {
printf("%06d %s %d\n",students[j].id,students[j].name.c_str(),students[j].grade);
}
return 0;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。