关于算法-数据结构:PAT甲级1028-List-Sorting

题目粗心:

给出N个考生的准考证号、姓名、分数,并输出参数C,要求按C的不同取值进行排序:

  1. C= 1,则按准考证号从小到大排序。
  2. C= 2,则按姓名字典序从小到大排序;若姓名雷同,则按准考证号从小到大排序。
  3. 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;
}

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理