贪心区间类型题目的解法 (C++)

C++区间覆盖(贪心算法) 区间覆盖解决方案 阅读详情

贪心区间类型题目的解法

题目和思路均来自AcWing及其视频讲解
这个文章我当作笔记

区间选点

给定 N 个闭区间 [ai,bi],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。

输出选择的点的最小数量。

读入区间, 将区间按右端点从小到大的排序, 然后从前往后枚举区间

最大不相交区间数量

给定 N 个闭区间 [ai,bi],请你在数轴上选择若干区间,使得选中的区间之间互不相交(包括端点)。

输出可选取区间的最大数量。

读入区间, 将区间按右端点从小到大的排序, 然后从前往后枚举区间

#include<iostream>
#include<algorithm>

using namespace std;

typedef pair<int, int> PII;

const int N = 100010;

int n;

struct Edge {
	int l, r;
	bool operator< (const Edge & t) const {
		return r < t.r;
	}
}nums[N];

int main() {
	cin >> n;
	for (int i = 0; i < n; i++)
		scanf("%d%d", &nums[i].l, &nums[i].r);

	sort(nums, nums + n);

	int cnt = 0;
	int ed = -2e9;

	for (int i = 0; i < n; i++) {
		if (nums[i].l > ed) {
			ed = nums[i].r;
			cnt ++;
		}
	}

	cout << cnt << endl;
	return 0;

}

区间分组

给定 N 个闭区间 [ai,bi],请你将这些区间分成若干组,使得每组内部的区间两两之间(包括端点)没有交集,并使得组数尽可能小。

输出最小组数。
  1. 将所有的区间以左端点从小到大的排序
  2. 从前往后处理每个区间, 判断能否将其放到某个现有的组中, 若能放,则放, 不能放则放到一个新的组
#include<iostream>
#include<algorithm>
#include<queue>


using namespace std;

const int N = 100010;

int n;
struct Range{
	int l, r;
	bool operator< (const Range &w) const {
	return l < w.l;
	}
}range[N];

int main() {
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		int l, r;
		scanf("%d%d", &l, &r);
		range[i] = {l, r};
	}
	
	sort(range, range + n);
	
	priority_queue<int, vector<int>, greater<int>> store; 	// 维护每个组的最大的右端点
	for (int i = 0; i < n; i++) {
		auto r = range[i];
		if (store.empty() || store.top() >= r.l) store.push(r.r);
		else {
			int t = store.top();
			store.pop();
			store.push(r.r);
		}
	}
	cout << store.size();
	return 0;
	
}

区间覆盖

给定 N 个闭区间 [ai,bi] 以及一个线段区间 [s,t],请你选择尽量少的区间,将指定线段区间完全覆盖。

输出最少区间数,如果无法完全覆盖则输出 −1。
  1. 将左端点从小到大排序
  2. 从前往后依次枚举每个区间, 在所有能覆盖start的区间中选一个右端点最大的区间, 选完以后,将start更新成右端点的最大值
#include<iostream>
#include<algorithm>

using namespace std;

const int N = 100010;

int n;
struct Range {
	int l, r;
	bool operator< (const Range &w) {
		return l < w.l;
	}
}range[N];

int main() {
	int st, ed;
	scanf("%d%d", &st, &ed);
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		int l, r;
		scanf("%d%d", &l, &r);
		range[i] = {l, r};
	}
	
	sort(range, range + n);
	
	int res = 0;
	bool success = false;
	for (int i = 0; i < n; i++) {
		int j = i, r = -2e9;
		while (j < n && range[j].l <= st) {
			r = max(r, range[j].r);
			j++;
		}
		
		if (r < st) {
			res = -1;
			break;
		}
		
		res++;
		
		if (r >= ed) {
			success = true;
			break;
		}
		
		st = r;
		
		i = j - 1;
	}
	
	if (!success) res = -1;
	cout << res << endl;
}

区间合并

给定 n 个区间 [li,ri],要求合并所有有交集的区间。

注意如果在端点处相交,也算有交集。

输出合并完成后的区间个数。
#include<iostream>
#include<algorithm>

#define x first
#define y second

using namespace std;

typedef pair<int, int> PII;

const int N = 100010;

int n;
PII nums[N];


int main() {
	cin >> n;
	for (int i = 0; i < n; i++) {
		scanf("%d%d", &nums[i].x, &nums[i].y);
	}
	
	sort(nums, nums + n);
	
	int cnt = 0;
	int r = -1e9 - 10;
	for (int i = 0; i < n; i++) {
		if (nums[i].x > r) {
			cnt++;
			r = nums[i].y;
		} else {
			r = max(nums[i].y, r);
		}
	}
	cout << cnt << endl;
	return 0;
} 
贪心算法总结(C++) 其中代码的核心逻辑是排序策略,是先由左端点值由大到小排序,再由右端点由小到大,(这里不知道为什么我试了一下再由右端点由大到小排序也能完美通过,我先把这个问题放在这里思考一下,可能也可以,也可能是数据不全面),而不是先由右端点值排序(虽然只是简单的两行代码写错,但写对了就是满分,写错了可能就是0分或碰巧对几组数据20分左右,差距挺大的)。好吧,到现在我还没看出来我哪里错了,先放在这里,以后再回过头来研究。在这里,我想提炼一下精华。题目:给定𝑛个可能含有前导0的数字串,将它们按任意顺序拼接,使生成的整数最小。 阅读详情

相关推荐

收藏 | C语言最常用的贪心算法

贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性(即某个状态以后的过程不会影响以前的状态,只与当前状态有关。)所以,对所采用的贪心策略

yx5666的博客 4640

【C++算法】贪心算法-区间问题,超详细注释例题讲解

贪心策略:新建一个结构体存储区间的左端点和右端点,将这N个区间按照右端点从小到大排序,遍历所有的区间,如果当前遍历到的区间左端点的值大于了上一个区间的右端点的值,说明此时区间没有重合,则区间个数+1

qq_63586399的博客 2276

435. 无重叠区间

本题可以通过贪心算法来解决。贪心策略是每次选择结束时间最早的区间,这样能为后面的区间留下更多的空间,从而减少需要移除的区间数量。返回需要移除区间的最小数量,使剩余区间互不重叠。

qq_40844444的博客 704

OpenJudge noi 7620区间合并

Description 给定 n 个闭区间 [ai; bi],其中i=1,2,…,n。任意两个相邻或相交的闭区间可以合并为一个闭区间。例如,[1;2] 和 [2;3] 可以合并为 [1;3],[1;3] 和 [2;4] 可以合并为 [1;4],但是[1;2] 和 [3;4] 不可以合并。 我们的任务是判断这些区间是否可以最终合并为一个闭区间,如果可以,将这个闭区间输出,否则输出no

loi_black蒟蒻的博客 1549

华为OD机试双机位C卷:区间连接器 (C/C++/Py/Java/Js/Go)

华为OD机试双机位C卷 【区间连接器】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试双机位C卷 - 区间连接器。

qq_45776114的博客 657

C语言最常用的贪心算法就这么被攻克了

来源:大鱼机器人01基本概念贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整...

编程与实战的博客 3988

算法基础篇:(十一)贪心算法拓展之区间问题:从重叠到覆盖的最优解艺术

本文探讨了贪心算法在区间问题中的应用,总结了四种典型问题及对应策略:区间选择问题(按结束时间排序选择最早结束)、点覆盖问题(在右端点放置点)、区间匹配问题(优先分配最小合适资源)和区间划分问题(用小根堆优化分配)。通过洛谷P1803、UVA1193等经典例题,详细分析了贪心策略的设计思路、最优性证明方法(交换论证法、反证法)及C++代码实现。文章还提炼了"三步法"解题框架(转化问题、选择排序维度、设计策略),并指出常见误区。

2301_79248256的博客 1989

配置 NVIDIA RTX 5090 + sm_120 + flashattention,已跑通一个大模型 ~~

本文介绍了在Ubuntu 22.04系统下为NVIDIA RTX 50系显卡搭建深度学习环境的完整流程。重点包括:1)安装适配50系显卡(sm_120架构)的CUDA 12.9驱动和Toolkit,需注意禁用系统自带驱动;2)配置环境变量解决nvcc命令识别问题;3)通过源码编译方式安装支持sm_120的PyTorch nightly版本(cu129),解决官方二进制包不兼容问题。整个过程涉及显卡驱动安装、CUDA环境配置、PyTorch适配等关键步骤,并提供了详细的验证方法和常见问题解决方案。文中特别强调

qq_36674060的博客 6160

线段覆盖系列(dp+贪心)

我的内心毫无波动......

薇小薇 1096

XTDrone平台FAST-LIO2与ego-planner结合路径规划部署

之前做了XTDrone平台FAST-LIO2的部署现在将其结合ego-planner进行导航规划,之前查看教程是使用视觉进行定位导航的,现在重新学习。修改advanced_param_xtdrone.xml,这里有视觉信息,不修改会报错显示为输入视觉话题信息。怎么描述 ,感觉当时觉得很难的问题突然就给解决了,一顿复杂,最近勤更新吧,继续开始学习。还有一个想法就是两个rviz结合在一起启动,写了一个demo,融合的不太好感觉额。改为只使用雷达点云,这里仿真的话题是/scan。

m0_56093217的博客 1083

OpenSpec 从入门到精通:AI 时代的最佳 SDD 范式

同样都是「先写规范再写代码」的开源 SDD 框架,OpenSpec(https://github.com/fission-ai/openspec) 展现出了极高的工程性价比,无论是使用 Claude Code、Cursor 还是 Aider,都可以无缝接入 OpenSpec 的规格管理层。这些问题需要人来做判断,AI 做不了这个主。整个流程跑下来,OpenSpec 产出的效果还是令人满意的,一些前期没有考虑到的细节 AI 都补上了,生成的相关文档也有利于开发人员的知识对齐,可以尝试在团队内部推广。

qq_39093474的博客 933

leetcode贪心策略篇总结(C++)

本质上是通过选取每一阶段的局部最优,最终达成全局最优1、贪心没有什么固定套路2、注意到本题中数组元素的范围为 [-100, 100],因此我们可以使用计数数组(桶)或者哈希表,直接统计每个元素出现的次数,再升序遍历元素的范围,这样就省去了排序需要的时间。3、很多题本质上是一样的,重点是如何把题目转化为可以解决的问题。4、数据结构的选择在运行时间上也很重要,比如 通过身高重建队列的。

weixin_42783170的博客 1429

小米万兆路由器里的Docker安装可道云(Kodexplorer)私有网盘

小米2022年12月份发布了万兆路由器,里面可以使用Docker。 今天尝试在小米的万兆路由器里安装[可道云](http://kodcloud.com/)(Kodexplorer)私有网盘。

engchina的专栏 1万+

算法打卡day31|贪心算法篇05|Leetcode 435. 无重叠区间、763.划分字母区间、56. 合并区间

JAVA算法|贪心算法篇05|Leetcode 435. 无重叠区间、763.划分字母区间、56. 合并区间

改变从现在开始 1073

手把手教你做基于stm32的红外、语音、按键智能灯光控制(上)

这次项目使用的板子是stm32f103c8t6最小系统板,这个板子在tb上都能够买到,随便一个最小系统板都可以,== 注意在买最小系统板的时候需要买一个stlink下载器来下载程序。显示模块是使用的0.96英寸的OLED屏幕,注意是使用的IIC通信协议的OLED屏幕,不是使用SPI总线协议的。这次写的代码还顺便集成了检测温湿度的功能,所以要使用DHT11温湿度传感器,来采集温度。本文所设计的基于单片机的灯光控制系统主要由模式选择功能、手动模式和自动模式组成。LED灯自然就是要控制的部件了。

nbbskk的博客 6557

【RT-DETR有效改进】手把手带你调参RT-DETR,1:1复现官方版本实验环境

本文是带大家进行调参,利用ultralytics仓库1:1复现RT-DETR官方实验环境,从而在后期发表论文 的时候省去一些不必要的麻烦,例如被审稿人提出质疑,本文的调参内容均有依据,根据RT-DETR官方Github上发布的版本进行设置本文的调参以ResNet18为例,其余的何其的调参基本一致。RT-DETR剑指论文专栏,持续复现各种顶会内容——论文收割机RT-DETR。

Snu77的博客 9940

【贪心算法】day9

【贪心算法】day9:354. 俄罗斯套娃信封问题、397. 整数替换、452. 用最少数量的箭引爆气球

tan_run的博客 2314

软件设计师---程序设计语言

软件设计师---程序设计语言

我从不打没有准备的仗! 2万+

【贪心算法】day8

【贪心算法】day8:991. 坏了的计算器、56. 合并区间、435. 无重叠区间

tan_run的博客 996

【100%通过率】2023华为od机试C卷【围棋的气】Python 实现

围棋棋盘由纵横各19条线垂直相交组成,棋盘上一共19 x 19 = 361 个交点,对奔双方一方执白棋,一方执黑棋,落子时只能将棋子置于交点上。 “气”是围棋中很重要的一个概念,某个棋子有几口气,是指其上下左右方向四个相邻的交叉点中,有几个交叉点没有棋子,由此可知:

MISAYAONE的博客 1859

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【贪心算法】day7

【贪心算法】day7:55. 跳跃游戏、134. 加油站、738. 单调递增的数字

tan_run的博客 2217

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【贪心算法】day4

【贪心算法】day4:122. 买卖股票的最佳时机 II、1005. K 次取反后最大化的数组和、2418. 按身高排序

tan_run的博客 1629

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

《算法实战笔记》第10期:六大算法实战——枚举、贪心、并查集、Kruskal、双指针、区间DP

本期涉及算法:二进制枚举,模拟,贪心,贪心 + 并查集 + kruskal算法,双指针,区间dp(动态规划)。题目清单: 1.PERKET 2.生活大爆炸版石头剪刀布 3.花匠 4.营救 5.School Photo 6.Zuma 这些题目摘录于洛谷,好题,典型的题,考察各类算法运用,可用于蓝桥杯及各类算法比赛备战,算法题目练习,提高算法能力,补充知识,提升思维。

燃于AC之乐的博客 1539

拼多多春招算法题解析:区间调度与贪心算法实战

区间调度是算法设计中的经典问题,其核心思想是通过贪心策略在满足约束条件下实现最优资源分配。这类算法通常基于结束时间排序,通过局部最优选择达到全局最优解,时间复杂度可优化至O(nlogn)。在实际工程中,类似技术广泛应用于会议室预定、CPU任务调度等场景,体现了算法设计与工程实践的紧密结合。以拼多多春招题目'多多的排课'为例,该问题要求在不重叠的时间段内安排最多课程,这正是区间调度算法的典型应用。掌握这类算法不仅能提升面试通过率,更能培养解决实际资源分配问题的工程思维。

weixin_30883311的博客 378

30行代码解决划分字母区间:贪心算法的边界扩展艺术

你是否曾在处理字符串分区时遇到这样的困境:如何将字符串分割成尽可能多的片段,使每个字母仅出现在一个片段中?LeetCode 763题"划分字母区间"正是这样一道经典算法题,它不仅考察字符串处理能力,更是对贪心算法思想的绝佳实践。本文将深入剖析这道题的最优解法,通过C与Go两种语言实现,带你掌握"边界扩展"这一贪心策略的精髓,学会在复杂约束下寻找最优解的思维方式。 ## 问题本质:寻找不重叠的字符...

gitblog_00863的博客 348
上一篇: 算法笔记 离散化(整数离散化)
下一篇: 图论问题的算法 (C++)
ghost_him
博客等级 码龄6年 598粉丝 90原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值