当前位置:首页 > 牛客 > 牛客4854题:学生信息排序算法实现与优化

牛客4854题:学生信息排序算法实现与优化

4个月前 (08-13)

牛客4854题:学生信息排序算法实现与优化 牛客题解 C++ 排序 第1张

一、题目解读

牛客4854题要求对n个学生的姓名和成绩进行排序,操作op=1时按成绩升序,op=2时按成绩降序,若成绩相同则按原始输入顺序排序。题目核心在于处理双重排序条件:成绩优先级高于输入顺序,需设计合理的排序逻辑。

二、解题思路

1. 使用C++ STL的sort函数简化排序流程,关键在于自定义比较函数。

2. 定义Student结构体存储姓名、成绩及输入顺序(order字段),确保成绩相同时可依据order排序。

3. 根据op选择升序(cmp_asc)或降序(cmp_desc)比较函数,二者均优先比较成绩,成绩相同则比较order。

三、解题步骤

1. 输入学生数量n与排序操作op。

2. 创建Student数组并读取姓名、成绩,同时记录当前输入顺序(i)。

3. 根据op选择排序方式:

    op=1调用sort(students, cmp_asc)升序排序;

    op=2调用sort(students, cmp_desc)降序排序。

4. 遍历排序后的students输出姓名与成绩。

四、代码及注释

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

struct Student {
    string name;
    int score;
    int order;  // 记录输入顺序(关键!解决成绩相同时的排序依据)
};

// 升序比较函数
bool cmp_asc(const Student &a, const Student &b) {
    if(a.score!= b.score) return a.score < b.score;  // 优先按成绩升序
    return a.order < b.order;  // 成绩相同按输入顺序
}

// 降序比较函数
bool cmp_desc(const Student &a, const Student &b) {
    if(a.score!= b.score) return a.score > b.score;  // 优先按成绩降序
    return a.order < b.order;  // 成绩相同按输入顺序
}

int main() {
    int n, op;
    cin >> n >> op;  // 输入学生数与排序操作

    vector<Student> students(n);
    for(int i = 0; i < n; i++) {
        cin >> students[i].name >> students[i].score;
        students[i].order = i;  // 记录当前学生的输入顺序
    }
    
    // 根据op选择排序方式
    if(op == 1) {
        sort(students.begin(), students.end(), cmp_asc);
    } else {
        sort(students.begin(), students.end(), cmp_desc);
    }
    
    // 输出排序结果
    for(const auto &s : students) {
        cout << s.name << " " << s.score << endl;
    }
    
    return 0;
}

五、总结

1. 自定义比较函数是sort函数处理复杂排序的核心,需明确优先级逻辑(成绩 > 输入顺序)。

2. 记录输入顺序的“order”字段巧妙解决成绩相同时的二重排序问题,避免额外数据结构

3. 利用sort函数提升效率,避免手动编写冒泡/选择排序的复杂性与低效性。

4. 该解法兼顾代码简洁性与算法正确性,适合实际编程场景。


原创内容 转载请注明出处

分享给朋友:

相关文章

牛客14496题解:括号最大深度问题(栈思想与代码优化)

牛客14496题解:括号最大深度问题(栈思想与代码优化)

一、题目解读牛客14496题要求计算给定括号字符串中的最大深度。例如,对于字符串 "(()())",最大深度为2。题目考察对括号嵌套结构的理解,以及如何通过编程找到最深嵌套层次。二...

洛谷1656题解:基于Tarjan算法求解割边问题(附代码与详细步骤)

洛谷1656题解:基于Tarjan算法求解割边问题(附代码与详细步骤)

一、题目解读洛谷1656题要求在无向图中找出所有割边(即删除后导致图不连通的边)。题目核心在于判断图的连通性,并识别哪些边是“桥”。需理解图论中的连通分量概念,以及如何通过算法高效定位割边。二、解题思...

洛谷P1121题解:动态规划求解环形数组最大子段和问题(附代码注释)

洛谷P1121题解:动态规划求解环形数组最大子段和问题(附代码注释)

一、题目解读洛谷P1121题要求求解环形数组的最大子段和,即在一个环形数组中找到一个连续子段,使其元素和最大。环形数组的特殊性在于首尾元素可相连,需考虑线性子段与跨越首尾的环形子段两种情况。二、解题思...

牛客232639题解析:双指针+排序算法高效求解三角形数量(附代码详解)

牛客232639题解析:双指针+排序算法高效求解三角形数量(附代码详解)

一、题目解读牛客232639题要求计算一个整数数组中能够组成有效三角形的三边组合数量。根据三角形不等式,三边需满足任意两边之和大于第三边。例如,数组[3, 4, 5, 6]可组成两个有效三角形([3,...

牛客4432题解题全解析:矩阵快速幂优化楼梯攀登问题(附C++代码)

牛客4432题解题全解析:矩阵快速幂优化楼梯攀登问题(附C++代码)

一、题目解读牛客4432题要求计算在n阶楼梯中,每次可爬1阶或2阶,共有多少种不同的攀登方式。该问题属于经典的动态规划类题目,需通过数学递推或矩阵乘法优化算法以应对较大数据规模。题目核心在于寻找高效计...

洛谷P3393题解:基于多源BFS与Dijkstra算法求解图论最小花费路径问题

洛谷P3393题解:基于多源BFS与Dijkstra算法求解图论最小花费路径问题

一、题目解读洛谷P3393题要求在一个包含N个城市和M条双向道路的图中,求解从起点1到终点N的最小花费路径。图中存在僵尸城市(僵尸无法通过)和危险城市(由僵尸城市扩散S步后标记),需要避开所有危险城市...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。