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语言中,常见的排序方法有冒泡法,排序法,插入法等等.所谓的冒泡法,就是对一组数字进行从大到小或者从小到大的一种排序方法.主要就是相邻的数值相互交换.从第一个数值开始,如果这相邻的两个数值排序与我们 ...
随机推荐
- log日志框架和LocationAwareLogger问题
遇到了同样的问题, 我的解决办法是在pom.xml中增加如下配置,去除对于jcl-over-slf4j.jar的依赖. <exclusions> <ex ...
- 接口测试工具 — jmeter(基本使用)
1.打开jemeter(bin目录下jemter.bat) 2.基本操作
- window7系统下安装scrapy爬虫框架
本文是在python3.6环境下安装的下面软件,如果大家和我的python版本不一致,请在页面选择符合自己版本的软件下载. 1.wheel pip install wheel 2.lxml 下载lxm ...
- Java并发—简介与线程创建
程序.进程和线程 程序:一段静态的代码,一组指令的有序集合,不运行的话只是一堆代码. 程序并不能单独执行,只有将程序加载到内存中,系统为他分配资源后才能够执行,这种执行的程序称之为进程.也就是说进程是 ...
- Java基础—运算符(转载)
转载自:Java运算符 计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量.我们可以把运算符分成以下几组: 算术运算符 关系运算符 位运算符 逻辑运 ...
- 003 F-47创建预付定金请求检查增强-20150819.docx
Enhancement SE38:LEINRF26 操作F-47,预付定金请求回车时,检查输入的采购订单项目发票视图,预付定金% 栏位,若为空,则报错,不为空可继续. 检查逻辑:检查采购凭证项 ...
- python2 和 pyhton3 输入语句写法
Python的输入语句类型 1 python2的输入语句 在python2中有两种常见的输入语句,input()和raw_input(). (1)input()函数 可以接收不同类型的参数,而且返回的 ...
- 剑指offer 面试52题
面试52题: 题目:两个链表的第一个公共节点 题:输入两个链表,找出它们的第一个公共节点. 解题思路: ①蛮力法:在第一个链表上顺序遍历每个节点,每遍历到一个节点,就在第二个链表上顺序遍历每个节点,直 ...
- 面向对象之继承(Day24)
一.继承 1.什么是继承 继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类 2.继承与抽象(先抽象再继承) 抽象基抽取类似或 ...
- offsetLeft与style.left的区别
参考:http://www.cnblogs.com/woshilee/articles/1951457.html offsetLeft 获取的是相对于父对象的左边距 left 获取或设置相对于 具有定 ...