1、成绩排序 -- 牛客

题目描述

查找和排序

题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩
都按先录入排列在前的规则处理。

示例:
jack      70
peter     96
Tom       70
smith     67

从高到低  成绩 
peter     96 
jack      70 
Tom       70 
smith     67

从低到高

smith     67

jack      70 

Tom      70 
peter     96

 

输入描述:

输入多行,先输入要排序的人的个数,然后输入排序方法0(降序)或者1(升序)再分别输入他们的名字和成绩,以一个空格隔开

输出描述:

按照指定方式输出名字和成绩,名字和成绩之间以一个空格隔开

示例:

输入:

3
0
fang 90
yang 50
ning 70

输出:

fang 90
ning 70
yang 50

解决思路


1、这是一道多条件排序问题。首先需要建立结构体来存放字符串与整型变量

2、利用stable_sort() 来根据进行升序,降序排列。

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <string>
 4 #include <vector>
 5 using namespace std;
 6 
 7 typedef struct stu
 8 {
 9     string name;
10     int grade;
11 }student;
12 
13 int cmp1(student a,student b)
14 {
15     return a.grade > b.grade;
16 }
17 
18 int cmp2(student a,student b)
19 {
20     return a.grade < b.grade;
21 }
22 
23 
24 int main()
25 {
26     int count=0,cmp=0;
27     student s;
28     int grade;
29     string name;
30     int n = count;
31     while(cin >> count >> cmp)
32     {
33         vector<student> stuVect;
34         while(count--)
35         {
36             cin >> name >> grade;
37             s.name = name;
38             s.grade =grade;
39             stuVect.push_back(s);
40         }
41             if(cmp == 0)
42                 stable_sort(stuVect.begin(),stuVect.end(),cmp1);
43             if(cmp == 1)
44                 stable_sort(stuVect.begin(),stuVect.end(),cmp2); 
45         
46         for(auto it = stuVect.begin(); it != stuVect.end(); it++)
47         cout << it -> name << ' ' << it -> grade << endl;
48     }
49     return 0;
50 }

summary

遇到了很多的麻烦,通过这道题目我也认识到了很多新的知识点

1、sort() 函数  与 stable_sort() 函数

  • 需要头文件<algorithm>
  • 语法描述:sort(begin,end,cmp)stable_sort(begin,end,cmp),cmp参数可以没有,如果没有默认非降序排序。
  • stable_sort() 函数 可保证相等元素的原本相对次序在排序后保持不变
  • 这个函数可以传两个参数或三个参数。第一个参数是要排序的区间首地址,第二个参数是区间尾地址的下一地址。也就是说,排序的区间是[a,b);
  • 简单来说,有一个数组int a[100],要对从a[0]到a[99]的元素进行排序,只要写sort(a,a+100)就行了,默认的排序方式是非降序排列。
  • 对于vector 变量来说,sort(v.begin(),v.end())

在这里要注意一下函数的 cmp 参数:

如果是没有定义小于运算的数据类型,或者想改变排序的顺序,就要用到第三参数——比较函数。

比较函数是一个自己定义的函数,返回值是bool型或整型,它规定了什么样的关系才是“小于”。想把刚才的整数数组按降序排列,可以先定义一个比较函数cmp

1 bool cmp(int a,int b)
2 {
3    return a>b;
4 }

2、vector 容器的应用

  • push_back 在数组的最后添加一个数据
  • pop_back 去掉数组的最后一个数据
  • at 得到编号位置的数据
  • begin 得到数组头的指针
  • end 得到数组的最后一个单元+1的指针

3、访问vector 

1     //使用迭代器将容器中数据输出 
2     vector<int>::iterator it;//声明一个迭代器,来访问vector容器,作用:遍历或者指向vector容器的元素 
3     for(it=obj.begin();it!=obj.end();it++)
4     {
5         cout<<*it<<" ";
6     }

 

 

  

 

上一篇:618 大促背后的淘系前端技术体系


下一篇:KDTree笔记