C-区间覆盖问题

该博客探讨了一种贪心算法的应用,解决如何使用尽量少的区间覆盖数轴上的指定线段[1, t]的问题。博主首先解释了题意,指出问题的关键在于寻找局部最优解,即每次选取右边界最大的区间。通过区间排序,当第一个区间的左边界大于1时,问题无解。接着,博主阐述了如何找到并累加覆盖线段的区间,强调了区间连续性的重要性。最后,博主总结了贪心策略在解决此类问题中的核心思想,并提供了代码实现。" 105450318,7511762,Oracle AWR跨库迁移指南,"['数据库管理', 'Oracle AWR', '数据迁移']
摘要由CSDN通过智能技术生成

题意

数轴上有 n (1<=n<=25000)个闭区间 [ai, bi],选择尽量少的区间覆盖一条指定线段 [1, t]( 1<=t<=1,000,000)。

覆盖整点,即(1,2)+(3,4)可以覆盖(1,4)。
不可能办到输出-1

思路

  • 此题是一个贪心问题,需要找到局部最优解,从题意分析,每一次取最大的区间右边界则是局部最优的,更容易到达目标边界。
  • 首先进行区间排序,区间左边界升序,右边界降序
  • 然后进行处理无用区间,排序后如果第一个区间的左边界大于1,则是无解的(永远无法覆盖1这个点),直接输出-1;
  • 然后就是找最大的右边界,找到的这些区间必须是相互重叠或者相连的,说明下一个最大区间的左边界必须在上一个最大区间之内或者相连。

例如 (1,15) ,(14, 27) 或者(1,8),(9,20)

  • 找到一个最大的右边界,结果累加一

总结

  • 在此题中,非常重要的就是区间的连续性,区间不能断,所以需要一定的条件保证区间断了之后,之前累加的结果不算,直接输出-1;
  • 贪心问题最重要的就是找到局部最优解,并且能够证明。

代码

#include<cstdio>
#include<algorithm>
#include<list>
using namespace std;
struct interval {
   
	int a;
	int b;
	bool operator <(const interval& P) {
   
		if(a!=P.a)
			return a < P.a;
		return b>P.b;
	}
};
int c = 0;
int c1;
bool ex 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值