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(, 'a'));
p.push_back(make_pair(, 'c'));
p.push_back(make_pair(, 't'));
p.push_back(make_pair(, 'y'));
p.push_back(make_pair(, 'b')); sort(p.begin(), p.end(), cmp);//按照第一个元素排序
for (auto i = ; i<p.size(); i++)
cout << p[i].first << " " << p[i].second << endl;
system("pause"); return ;
}
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 = ; i < n; ++i)
{
int temp;
cin >> temp;
nums.push_back(make_pair(i + , temp));
}
for (int i = ; i < k; ++i)
{
sort(nums.begin(), nums.end(), cmp);
if (nums[].second - nums[n - ].second <= )
break;
nums[].second--;
nums[n - ].second++;
res.push_back(make_pair(nums[].first, nums[n - ].first));
}
sort(nums.begin(), nums.end(), cmp);
cout << nums[].second - nums[n - ].second << " " << res.size() << endl;
for (int i = ; i < res.size(); ++i)
{
cout << res[i].first << " " << res[i].second << endl;
}
} system("pause");
return ;
}
C++(十二)— vector中pair的排序方法的更多相关文章
- vector中pair的排序方法
直接上代码: bool judge(const pair<int,char> a, const pair<int ,char> b) { return a.first<b ...
- VECTOR中pair的排序
vector中pair的排序方法 首先定义一个vector vector<pair<int,char> >vec; 调用排序函数sort sort(vec.begin(),ve ...
- (转)SpringMVC学习(十二)——SpringMVC中的拦截器
http://blog.csdn.net/yerenyuan_pku/article/details/72567761 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter, ...
- OpenJDK源码研究笔记(十二):JDBC中的元数据,数据库元数据(DatabaseMetaData),参数元数据(ParameterMetaData),结果集元数据(ResultSetMetaDa
元数据最本质.最抽象的定义为:data about data (关于数据的数据).它是一种广泛存在的现象,在许多领域有其具体的定义和应用. JDBC中的元数据,有数据库元数据(DatabaseMeta ...
- “全栈2019”Java多线程第十二章:后台线程setDaemon()方法详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- Expo大作战(十二)--expo中的自定义样式Custom font,以及expo中的路由Route&Navigation
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...
- Java笔记(十二)……类中各部分加载顺序及存放位置问题
什么时候会加载类 使用到类中的内容时加载,三种情况: 创建对象:new StaticDemo(); 使用类中的静态成员:StaticCode.num = 9; StaticCode.getNum() ...
- Java中常见的排序方法
本博主要介绍Java中几种常见的排序算法: /* 排序方法的演示1)插入排序(直接插入排序.希尔排序)2)交换排序(冒泡排序.快速排序)3)选择排序(直接选择排序.堆排序)4)归并排序5)分配排序(基 ...
- C语言中常见的排序方法
在C语言中,常见的排序方法有冒泡法,排序法,插入法等等.所谓的冒泡法,就是对一组数字进行从大到小或者从小到大的一种排序方法.主要就是相邻的数值相互交换.从第一个数值开始,如果这相邻的两个数值排序与我们 ...
随机推荐
- 介绍一下except的用法和作用?
Python的except用来捕获所有异常,因为Python里面的每次错误都会抛出一个异常,所以每个程序的错误都被当作一个运行时错误.
- 我的Android进阶之旅------>Android利用温度传感器实现带动画效果的电子温度计
要想实现带动画效果的电子温度计,需要以下几个知识点: 1.温度传感器相关知识. 2.ScaleAnimation动画相关知识,来进行水印刻度的缩放效果. 3.android:layout_weight ...
- 虚拟化qemu-img的简单用法。
qemu-img 命令行工具是 Xen 和 KVM 用来格式化各种文件系统的,可使用 qemu-img 格式化虚拟客户端映像.附加 ...
- 【WEB HTTP】集成点:网关、隧道及中继
网关:网关可以作为某种翻译器使用,它抽象出了一种能够到达资源的方法.网关是资源与应用程序之间的粘合剂. 在不同http版本之间进行转换的Web代理和网关一样,他们会执行复杂的逻辑,以便在各个端点之间进 ...
- Django为什么要跳转到不同的页面来实现不同的功能
其实是不同将信息提交给不同的页面交给不同的页面去处理同一个数据库,不同的模块实现不同的功能,当要实现某一个功能的时候直接跳转到那一个功能下面的url,可以把要实现的功能区分开,以python面向对象的 ...
- yii2判断数据库字段is null
$query = new Query; $query->select('ID, City,State,StudentName') ->from('student') ->]) -&g ...
- Linux Shell编程 循环语法
for循环 for 循环是固定循环,也就是在循环时已经知道需要进行几次循环.有时也把 for 循环称为计数循环.语法: for 变量 in 值1 值2 值3… do 程序 done 在这种语法中,fo ...
- Linux软件包管理 RMP包管理
概述 RPM 包的命名一般都会遵守统一的命名规则,例如: httpd-2.2.15-15.el6.centos.1.i686.rpm 其中的各项代表的含义如下: httpd:软件包名. 2.2.15: ...
- 【leetcode刷题笔记】Text Justification
Given an array of words and a length L, format the text such that each line has exactly L characters ...
- Java变量修饰符volatile
volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以 ...