当前位置: 首页 > news >正文

STD::pair<>的使用

pair的使用

#include<iostream>
#include<vector>
#include<string>
排序引入头文件:
#include<algorithm>
using namespace std;
说明:comp2:对的第一个成员排序(升序)
bool/int comp2(pair<int,int>&a,pair<int,int>&b)
{
	return a.first < b.first;
}
说明:comp1:对的第一个成员排序(降序)
bool/int comp1(pair<int,int>&a,pair<int,int>&b)
{
	return a.first >b.first;
}
说明:comp3:对的第二个成员排序
bool/int comp3(pair<int, int>& a, pair<int, int>& b)
{
	return a.second < b.second;
}
int main()
{
	初始化数据:
	vector<pair<int, int>>tmp = { {1,2},{4,9},{3,7} };
	vector<pair<int, int>>tmp1;
	插入数据方式:
	tmp1.push_back(pair<int, int>(11, 6));
	tmp1.push_back(pair<int, int>(6, 5));
	tmp1.push_back(pair<int, int>(2, 3));
	sort(tmp1.begin(), tmp1.end(), comp1);
	for (int i = 0; i < tmp.size(); i++)
	{ 
	cout << tmp1[i].first<<" "<<tmp1[i].second << endl;
	}
	return 0;

说明:comp:对的第一个成员排序(降序

tmp1.push_back(pair<int, int>(1, 6));
tmp1.push_back(pair<int, int>(6, 5));
tmp1.push_back(pair<int, int>(2, 3));

bool/int comp(pair<int,int>&a,pair<int,int>&b)
{
	return a.first >b.first;
}`

在这里插入图片描述


例题:射击气球

2.射击气球 已知在一个平面上有一定数量的气球,平面可以看做一个坐标系,在平面的X轴的不同位置安排弓箭手向Y轴方向射箭, 弓箭可以向y轴走无穷远,给定气球的宽度xstart<=x<=xend,问至少需要多少弓箭手,将全部气球打爆?
例如:四个气球,[[10,16],[2,8],[1,6],[7,12]],至少需要2个弓箭手。

/*
贪心规律:
1.对于一个气球,至少需要一个弓箭将它射击
2.在射击当前气球的同时,贪心的尽可能多的射击其他的气球—贪心
算法思想:
1.先对各个气球的区间,以起始点进行从小到大进行排序
2.遍历气球数组,同时要维护一个射击范围,在满足可以射击当前气球的同时,尽可能多的射击下一个气球,每次
射击一个气球,就要更新一次新的射击范围(保证新的范围可以射击新的气球)
3.如果当前的范围没有办法射击新的气球的,那么就要增加一个弓箭手,还要重新维护一个射击范围。
*/

#include<vector>
#include<algorithm>
#if 0
int mycmp(pair<int,int> &a,pair<int,int>&b)
{
	return a.first < b.first;
}
void main()
{
	vector<pair<int,int> > arr;
	arr.push_back(pair<int,int>(10,16));
	arr.push_back(pair<int,int>(2,8));
	arr.push_back(pair<int,int>(1,6));
	arr.push_back(pair<int,int>(7,12));
	arr.push_back(pair<int,int>(13,15));
	//1 排序
	sort(arr.begin(),arr.end(),mycmp); //按照气球的起始区间进行排序
	//射击范围
	
int shoot_begin = arr[0].first;
	int shoot_end = arr[0].second;
	int shoot_num = 1; //弓箭手个数
	for(int i = 1;i<arr.size();++i)
	{
		//看下一个气球的区间是否在当前范围,并更新射击范围
		if(arr[i].first <= shoot_end)
		{
			shoot_begin = arr[i].first;
			if(shoot_end > arr[i].second)
			{
				shoot_end = arr[i].second;
			}
		}
		else
		{
			//当前要射击的气球的起始区间>射击范围,增加弓箭手,并且将当前气球的区间作为新的射击范围
			shoot_num++;
			shoot_begin = arr[i].first;
			shoot_end = arr[i].second;
		}
	}
	cout<<"需要弓箭手个数为 : "<<shoot_num<<endl;
}

#endif


/*
1.最简单:有1元,5元,10元,20元,100元,200元的钞票无穷多张,现使用这些钞票支付X元,最少需要多少张?
例如:X = 628
2.射击气球
已知在一个平面上有一定数量的气球,平面可以看做一个坐标系,在平面的X轴的不同位置安排弓箭手向Y轴方向射箭,
弓箭可以向y轴走无穷远,给定气球的宽度xstart<=x<=xend,问至少需要多少弓箭手,将全部气球打爆?
例如:四个气球,[[10,16],[2,8],[1,6],[7,12]],至少需要2个弓箭手。
3.已知一些孩子和一些糖果,每个孩子有需求因子g,每个糖果有大小s,当某个糖果的大小s>=某个孩子的需求因子g时,
代表该糖果可以满足该孩子,求使用这些糖果,最多能满足多少孩子(注意,某个孩子最多只能用1个糖果满足)
例如:需求因子数组g={5,10,2,9,15,9};糖果大小数组s={6,1,20,3,8};最多可以满足3个孩子。
4.移除k个数字
已知一个使用字符串表示的非负整数num,将num中的k个数字移除,求移除k个数字后,可以获得的最小的可能
的新数字(nun不会以0开头,num长度小于10002)
输入:num=“1432219”,k=3,在去掉3个数字后得到的很多很多里,如1432,4322,2219,1219,1229等,
去掉数字4,3,2得到的1219最小。

分析:要让得到数字最小,需要尽可能让得到数字的最高位最小,次高位最小…----最优的
贪心:从高位开始向低位遍历,如果对应的数字大于下一位数字,那么就将该位数字去掉,贪心的保留小的,去掉大
12345 k=3
100300 k=1

/
/

贪心—遵循某种规律,不断贪心的选择当前最优策略的方法
*/
#include
using namespace std;

/*
贪心—贪心的使用面额较大的钞票,以达到最优解
原因:较大的面额是较小面额的倍数关系,当能用一张较大的面额来实现,如果用较小的面额来替换,则一定需要
更多的张数
600–200+200+200 —>3
600–100+100+100+100+100+100–>6

找零钱不一定都能用贪心----
如果面值没有规律(不是倍数关系),则贪心不成立
*/
#if 0
void main()
{
int money[] = {200,100,20,10,5,1}; //面额
int n = sizeof(money)/sizeof(money[0]);
int num = 628;
int count = 0;
int j = 0;
for(int i = 0;i<n;++i)
{
j = num / money[i];
count += j;
num = num - money[i] * j;
if(j != 0)
cout<<“需要”<<j<<“张”<<money[i]<<endl;
}
cout<<“最少需要张数为:”<<count<<endl;
}
#endif

思想:
1.排序–从小到大排序
需求因子更小的更容易满足,从需求因子小的尝试,可以得到更多的结果(目标是为了让更多的孩子满足)
2.如果该糖果不能满足该孩子,则该糖果也一定不能满足它后面的孩子(需求因子更大的孩子)
糖果1不能满足需求因子2,那么一定不能满足2后面的孩子
3.如果孩子可以用更小的糖果来满足,则没有必要用更大的糖果满足,贪心的将更大的糖果保留满足需求
因子更大的孩子

代码:
1.排序
2.按照从小到大的顺序使用各个糖果尝试是否可以满足某个孩子,每个糖果只尝试一次,当尝试成功时,就可以换下一个
孩子来尝试,直到没有更多的糖果或者孩子,则结束
*/
#if 0
void main()
{
int g[] = {5,10,2,9,15,9};
int s[] = {6,1,20,3,8};
int n = sizeof(g)/sizeof(g[0]);
int m = sizeof(s)/sizeof(s[0]);
sort(g,g+n);
sort(s,s+m);
int childnum = 0;
int cookienum = 0;
while(cookienum < m && childnum < n)
{
if(g[childnum] <= s[cookienum])
{
childnum++;
}
cookienum++;
}
cout<<"childnum = "<<childnum<<endl;
}
#endif

相关文章:

  • 公众号搜题功能接口API
  • python3-python中的GUI,Tkinter的使用,抓取小米应用商店应用列表名称
  • 公众号查题接口API
  • 提高「程序员」的思维方式
  • EasyExcel自定义Converter解决LocalDateTime系列时间日期转换的问题
  • Nginx限流优化
  • 洗地机暗战:蓝海到血海,内卷的尽头没有赢家
  • python神经网络编程 豆瓣,用python构建神经网络
  • 2-4.spring源码--BeanPostProcessor
  • Centos8/Rocky9/linuxmint-21/安装docker和docker安装python3.9【亲测有效】
  • 网课答案公众号接口API提供
  • 顺丰2022半年报:成绩单背后的业务韧性
  • 考研算法辅导课【合集】
  • LeetCode---SQL刷题5
  • xilinx ip xdc修改
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • C++类中的特殊成员函数
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • GraphQL学习过程应该是这样的
  • Java面向对象及其三大特征
  • mac修复ab及siege安装
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • 不上全站https的网站你们就等着被恶心死吧
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 警报:线上事故之CountDownLatch的威力
  • 微信小程序实战练习(仿五洲到家微信版)
  • 一道闭包题引发的思考
  • 一天一个设计模式之JS实现——适配器模式
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • ​什么是bug?bug的源头在哪里?
  • (175)FPGA门控时钟技术
  • (3)nginx 配置(nginx.conf)
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (vue)页面文件上传获取:action地址
  • (二)PySpark3:SparkSQL编程
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (原創) 未来三学期想要修的课 (日記)
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .Net FrameWork总结
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .NET性能优化(文摘)
  • .NET学习教程二——.net基础定义+VS常用设置
  • /run/containerd/containerd.sock connect: connection refused
  • @ModelAttribute 注解
  • @ResponseBody
  • [20180129]bash显示path环境变量.txt
  • [Android Pro] listView和GridView的item设置的高度和宽度不起作用
  • [Android]Android P(9) WIFI学习笔记 - 扫描 (1)
  • [docker] Docker容器服务更新与发现之consul
  • [flask] flask的基本介绍、flask快速搭建项目并运行
  • [leetcode] Multiply Strings