CSP-homework Week3 ProblemA 贪心两题---区间选点问题和区间覆盖问题(C++)

本文通过两道贪心算法问题——区间选点和区间覆盖,探讨贪心策略的应用。对于区间选点问题,采用按区间上限升序的贪心规则,选择最少的点覆盖所有区间;区间覆盖问题,通过预处理和排序,选择最长可用长度的区间,逐步覆盖目标区间。这两题展示了贪心算法在解决特定问题时的有效性和简洁性。
摘要由CSDN通过智能技术生成

总述

贪心算法是一种常用且便携的方法,且通常情况下是有效的。本文中叙述了两个基础且经典的贪心问题—区间选点问题和区间覆盖问题,希望读后有所理解。

题目一:区间选点问题

原题叙述

数轴上有 n 个闭区间 [a_i, b_i]。取尽量少的点,使得每个区间内都至少有一个点(不同区间内含的点可以是同一个)

INPUT

第一行1个整数N(N<=100)
第2~N+1行,每行两个整数a,b(a,b<=100)

OUTPUT

一个整数,代表选点的数目

输入样例

2
1 5
4 6

输出样例

1

题目重述

题意比较简单,给定N个区间,每个区间都要保证至少存在一个点,每个选中的点可以存在于多个区间中,尝试求出满足这个条件需要挑选多少个这样的点。

解题思路

思路概述

一道经典的贪心算法,贪心算法的最核心问题便是贪心规则,确定了贪心规则问题便能轻松的解决。
本题目中选用的贪心规则是依次选择最小的区间上限,依次考虑,如果区间内没有点就将区间的上限选用,直至全部区间被遍历到。
实际的实现思路大概可以描述为:
首先维持一个map[]数组来存放每个点是否被添加过,初始化所有点为0表示没有被添加过,在访问过程中需要添加进去就置为1。
添加一个全局变量

int number=0

作为添加点计数器,每当加入一个新点,计数器++
中间的贪心流程按照下图执行即可:

Created with Raphaël 2.2.0 对全部区间按照区间 上限值升序排序 访问区间中每个点 是否被添加过 map[]==1 该区间添加过点 访问下一个区间 yes no

如果访问到区间的上限还没找到添加过的点,说明这个区间需要新添加一个点进来,为了选用更少点覆盖较大的区间&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值