STL库sort和stable_sort函数

写在前面:

期中考试终于落下了帷幕,我又有时间来做oj题了【捂脸
近期一直在学数据结构,感觉好久没做OJ题了,,
比起写数据结构,我觉得做oj题更需要技巧,然后合理使用库函数很必要。

今天这道题一开始一直WA,以为是sort或stable_sort函数的问题,
最后在论坛大佬指点下终于找到了错误,是字符串比较出现了问题【扶额

不管他能不能看到,在这里,一定要感谢那位老哥,一针见血指出我的问题~

- 出错点:

  1. 库里的sort函数是不稳定的排序。(所以sort两遍行不通)
    两种解决方法:①改写cmp函数,使之可以二级排序;②用两遍stable_sort
  2. 用字符数组存的学号,在比较时直接用 < 来比
    解决方法:使用库函数 strcmp 来比较学号大小(字典序)。

- 参考博客:

题目:

  1. 成绩排序
    单点时限: 2.0 sec
    内存限制: 256 MB
    有 n(1⩽n⩽100)个学生的成绩记录,其中包含学号和成绩两项。

按照成绩从高到低顺序输出成绩及格(⩾60)学生的学号和成绩。成绩相同时按照学号从小到大顺序输出。
输入格式
第 1 行:输入一个整数 n,表示学生记录数。

第 2 行 ~ n+1 行:每行是学号(11 位数字)及成绩(0 到 100 之间的整数)。学号和成绩之间有一个空格。

输出格式
按要求输出结果,每行输出一个空格分隔的学号及成绩。

样例
input
5
10002130201 90
10002130230 80
10002130231 85
10002130148 48
10002130167 90
output
10002130167 90
10002130201 90
10002130231 85
10002130230 80

AC的代码:

#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;

struct Student{
        char num[12];
        int grades;
} ;

bool cmp(Student stu1, Student stu2){
    if(stu1.grades>stu2.grades)
        return true;
    else if(stu1.grades==stu2.grades)
    {
        if(strcmp(stu1.num,stu2.num)<0)
            return true;
        else
            return false;
    }
    else
        return false;
}

int main(){
    int n,i;

    cin>>n;
    Student stu[n];

    for(i=0;i<n;i++){
        cin>>stu[i].num;
        cin>>stu[i].grades;
    }
    sort(stu,stu+n,cmp);
    for(i=0;i<n;i++){
        if(stu[i].grades>=60)
            cout<<stu[i].num<<" "<<stu[i].grades<<endl;
    }
}

&

看看这“辉煌”的战绩【捂脸
EOJ 1017 成绩排序 C++

题后感:

其实也没啥感受,就感觉自己挺菜的,然后做题还挺爽的。
emm,还有,找到问题,解决问题的感觉真好~

——2019.4.29 23点34分 于寝室

相关文章: