贪心算法(Greedy Algorithm) 简介
贪心算法,又名贪婪法,是寻找最优解问题的常用方法,这种方法模式一般将求解过程分成若干个步骤,但每个步骤都应用贪心原则,选取当前状态下最好/最优的选择(局部最有利的选择),并以此希望最后堆叠出的结果也是最好/最优的解。
区间的元素选择
贪婪法的基本步骤:
步骤1:从某个初始解出发;
步骤2:采用迭代的过程,当可以向目标前进一步时,就根据局部最优策略,得到一部分解,缩小问题规模;
步骤3:将所有解综合起来。
下面是牛客上的试题:也可以参考知乎示例
题目描述
我们有很多区域,每个区域都是从a到b的闭区间,现在我们要从每个区间中挑选至少2个数,那么最少挑选多少个?
输入描述:
第一行是N(N<10000),表示有N 个区间,之间可以重复
然后每一行是ai ,bi ,持续N行,表示现在区间。均小于100000
输出描述:
输出一个数,代表最少选取数量。
示例1
输入
4
4 7
2 4
0 2
3 6
输出
4
---------------------
思路:
我们按照上面讲的基本步骤:
1、从初始解出发例如示例1输入数组为 res = [[4 ,7], [2, 4], [0 ,2], [3, 6]],在这几个区间内要找到最少选择的数量并且每个区间一定要选择至少两个数,那么我们就需要找出每个区间重合的部分。怎么找出重合的部分呢?首先肯定是在区间的边界上找,边界上是重合可能性最大的地方。因此我们要对这些区间先进行排序,res = [[0, 2], [2, 4], [3, 6], [4, 7]] ,显然初始解肯定是重第一个区间开始的在实例1中我们可以定位[1,2];
2、找出局部最优解,遍历每个区间去寻找两个相邻区间是否有相邻
3、将所有解综合在一起
参考代码(Python):
def checkRes(num, nums):
sol = []
sol.append(nums[0][1]-1)
sol.append(nums[0][1])
for i in range(num-1):
if nums[i+1][0] == sol[-1]: #区间相邻
sol.append(nums[i+1][1])
elif nums[i+1][0] > sol[-1]:#区间相离
sol.append(nums[i+1][1]-1)
sol.append(nums[i+1][1])
return len(sol)
if __name__=='__main__':
n = int(input())
res = []
for _ in range(n):
res.append(list(map(int,input().split())))
res.sort(key=lambda x:x[1]) #区间排序
print(checkRes(n,res))