STL库sort和stable_sort函数
写在前面:
期中考试终于落下了帷幕,我又有时间来做oj题了【捂脸
近期一直在学数据结构,感觉好久没做OJ题了,,
比起写数据结构,我觉得做oj题更需要技巧,然后合理使用库函数很必要。
今天这道题一开始一直WA,以为是sort或stable_sort函数的问题,
最后在论坛大佬指点下终于找到了错误,是字符串比较出现了问题【扶额
不管他能不能看到,在这里,一定要感谢那位老哥,一针见血指出我的问题~
- 出错点:
-
库里的sort函数是不稳定的排序。(所以sort两遍行不通)
两种解决方法:①改写cmp函数,使之可以二级排序;②用两遍stable_sort -
用字符数组存的学号,在比较时直接用 < 来比。
解决方法:使用库函数 strcmp 来比较学号大小(字典序)。
- 参考博客:
题目:
- 成绩排序
单点时限: 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;
}
}
&
看看这“辉煌”的战绩【捂脸
题后感:
其实也没啥感受,就感觉自己挺菜的,然后做题还挺爽的。
emm,还有,找到问题,解决问题的感觉真好~
——2019.4.29 23点34分 于寝室