C - 区间覆盖(贪心算法)

本文介绍了一种使用贪心算法解决区间覆盖问题的方法。针对数轴上的一系列闭区间,需要找到最少数量的区间来覆盖指定线段[1, t]。文章详细阐述了解题思路,包括区间按较小端点排序,从第一个区间开始判断,以及如何通过遍历和更新区间端点最大值(len)来确保选择的最优解。最后,提供了代码实现以辅助理解。" 112707108,10537574,数控车床对刀技巧:坐标原点设置与方法解析,"['数控编程', '机械制造', '加工工艺', '工业自动化', '机械工程']
摘要由CSDN通过智能技术生成

区间覆盖

  • 题意:
    数轴上有 n (1<=n<=25000)个闭区间 [ai, bi],选择尽量少的区间覆盖一条指定线段 [1, t]( 1<=t<=1,000,000)。
    覆盖整点,即(1,2)+(3,4)可以覆盖(1,4)。不可能办到输出-1

  • 输入输出:
    输入
    第一行:N和T
    第二行至N+1行: 每一行一个闭区间。
    输出
    选择的区间的数目,不可能办到输出-1
    在这里插入图片描述

  • 解题思路
    结构体node存储区间两个端点x和y,按照较小的端点x升序排列。首先区间覆盖需要满足从1开始,故先对第一个区间进行判断,若x值大于1则不满足条件,直接输出-1。

    定义变量len记录已经遍历过并被选中的区间端点的最大值,初始状态计数器count值为1,len值为第一个区间的y值,从第二个区间开始遍历,每次循环首先判断是否已经满足覆盖条件,若满足直接跳出循环,输出count。若不满足,判断下一个区间是否满足x值小于等于len+1同时y值大于len,若满足则记录该区间的y值maxlen,再从该区间向后遍历,如果还有其他满足条件且y值大于maxlen的,更新len值,若没有则直接更新len值,每更新一次计数器count加一。

    注意:不能直接更新len的原因
    例:
    3 10
    1 5
    4 8
    6 10
    若直接更新会导致区间(4,8)被选中,最终输出结果为3,显然结果错误。故应在(4,8)被选中时继续向后遍历查找有没有更优区间,即(6,10),若存在则直接更新len的值为10,否则会导致多选中不必要的区间,结果出错。

  • 代码实现

#include <iostream>
#include <cstdio> 
#include <algorithm>
using namespace std;

struct node
{
   
	int x
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值