挑战程序设计竞赛笔记-贪心算法

本文探讨贪心算法在程序设计竞赛中的运用,通过BestCowLine、Saruman’s Army和Fence Repair三个实例,阐述如何利用贪心策略解决实际问题,包括选取最优解、字典序比较和哈夫曼树思想,并提及了优先队列在解决问题中的作用。
摘要由CSDN通过智能技术生成

2.2 贪心算法

贪心算法的精髓在于,遵循某种规则,不断地选取当前最优解。

硬币问题
假设有 1 元,5元,10元,50元,100元,500元的硬币C1,C5,C10,C50,C500枚,现在需要凑出 A 元
问如何组合才能使硬币的数量最少?

这道题给人的印象就是,为了使得硬币数目最少,尽可能使用面值大的硬币。这种策略就是计算过程中的规则。尽可能使用最大面值,就是当前最优解。

所以,使用每个硬币的数目为:

int t = min(A/Y ,Y_Max);	//A为目标,Y为面值,Y_Max为面值为Y的硬币数目。

下面练习一道POJ3617:

2.2.1.BestCowLine
	给定长度为N的字符串S,要构造一个长度为N的字符串T,最开始T是一个空串,随后反复进行如下操作:
		1.从S的头部删除一个字符,加到T的尾部
		2.从S的尾部删除一个字符,加到T的头部
	目标是构建一个字典序尽可能小的字符串T。

这道题的贪心策略就是,每次都选取字符串S两头字典序较小的那个。因为规定只能从两端取,所以若两端的字典序有差别,则可以直接根据当前情况选择当前最优解。我们的需求也是,每次要选择小字典序的字母插入队列。

但是,如果字典序一样该选哪个呢?对于相同的字典序,对于当前情况是没有区别的。可是,如果一个字典序是ZB…CZÿ

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值