zoukankan      html  css  js  c++  java
  • C++(十二)— vector中pair的排序方法

    1、利用自定义的排序函数

    通过传递一个函数 cmp给sort函数 , 注意: cmp中return a<b; 决定为从小到大的排序

                            return a>b;  决定为从大到小的排序

    #include<iostream>
    #include<algorithm>
    #include<stdio.h>
    #include <vector>
    #include<string>
    using namespace std;
    
    bool cmp(const pair<int, char> a, const pair<int, char> b) {
        return a.first<b.first;//自定义的比较函数
    }
    
    int main()
    {
        vector<pair<int, char>> p;
        p.push_back(make_pair(10, 'a'));
        p.push_back(make_pair(9, 'c'));
        p.push_back(make_pair(10, 't'));
        p.push_back(make_pair(17, 'y'));
        p.push_back(make_pair(10, 'b'));
    
        sort(p.begin(), p.end(), cmp);//按照第一个元素排序
        for (auto i = 0; i<p.size(); i++)
            cout << p[i].first << "    " << p[i].second << endl;
        system("pause");
    
        return 0;
    }

    2、自定义字符串的排序函数

    (1)排序的比较方式,长度相同则字母排序,否则长度排序

      在函数中定义时不用将比较函数定义为静态成员函数。

    //排序的比较方式,长度相同则字母排序,否则长度排序
    bool compare( string s1, string s2)
    {
        if (s1.size() == s2.size())
            return s1 < s2;
        else if (s1.size() < s2.size())
            return true;
        return false;
    }

    (2)字符串数组排成最小的数

      在c++类中自定义比较函数时,需注意类中比较函数声明为静态成员函数。

    static bool compare(const string& a,const string& b)
        {
            string s1 = a+b;
            string s2 = b+a;
            return s1<s2;   
        }

    3、举例:调整塔的高度

    给出塔的数量n和调整最大次数k,以及每个塔的高度,在有限次数内调整塔的高度,使最大塔差最小。

    输入:3 2

    5 8 5

    输出:0 2

    2 1

    2 3

      使用pair结构保存数据。

    #include<iostream>
    #include<algorithm>
    #include<stdio.h>
    #include <vector>
    #include<string>
    #include<map>
    using namespace std;
    
    
    bool cmp(pair<int, int>& a, pair<int, int>& b) {
        // 开始没写这个 if,卡在 20% ,加上100%
        // 减的时候,先拿编号大的;加的时候,先拿编号小的
        if (a.second == b.second) {
            return a.first > b.first;
        }
        return a.second > b.second;
    }
    
    int main()
    {
        int n, k;
        while (cin >> n >> k)
        {
            vector<pair<int, int>> nums;
            vector<pair<int, int>> res;
            for (int i = 0; i < n; ++i)
            {
                int temp;
                cin >> temp;
                nums.push_back(make_pair(i + 1, temp));
            }
            for (int i = 0; i < k; ++i)
            {
                sort(nums.begin(), nums.end(), cmp);
                if (nums[0].second - nums[n - 1].second <= 1)
                    break;
                nums[0].second--;
                nums[n - 1].second++;
                res.push_back(make_pair(nums[0].first, nums[n - 1].first));
            }
            sort(nums.begin(), nums.end(), cmp);
            cout << nums[0].second - nums[n - 1].second << " " << res.size() << endl;
            for (int i = 0; i < res.size(); ++i)
            {
                cout << res[i].first << " " << res[i].second << endl;
            }
        }
    
        system("pause");
        return 0;
    }
  • 相关阅读:
    使用公用表表达式的递归查询
    cocos2d-x 精灵的创建和基本使用
    全栈project师的毁与誉
    使用zTree和json构建简单树节点
    使用贝赛尔曲线画扇形、圆形、弧线、多边形,实现App下载时的动画效果demo
    UIBezierPathStudyDemo
    iOS-swift环形进度指示器+图片加载动画
    IOS之以UIBezierPath绘制饼状图
    Swift之UIBezierPath
    swift app中展示折线图, 饼状图, 柱状图等数据图表
  • 原文地址:https://www.cnblogs.com/eilearn/p/9462236.html
Copyright © 2011-2022 走看看