题目粗心:
给出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;}