首页 > 其他分享 >贪心策略小结

贪心策略小结

时间:2022-11-23 19:22:10浏览次数:61  
标签:frac 策略 max times ib 小结 leqslant 贪心

NOIP考前攒rp,希望HB不要G

有很多题目,看似是不可实现的,比如 \(5\times 10^7\) 的量级,严格处理的复杂度是 \(O(N^2)\) 或者 \(O(N\log N)\) 的。没法在合规的时间里解决,这种情况一般会在证明之后直接得到最优解——这种策略就称作贪心。
当然,也有的时候贪心是用来辅助优化复杂度的。

直接贪心

这一类的贪心往往可以直接证明最优性。

[NOIP2002 提高组] 均分纸牌

最左边的一组牌如果不是刚好的,它必然会有一次移动一次,并且之后不会再移动,所以顺着枚举当前位置是否需要移动即可。

[NOIP2004 提高组] 合并果子

Huffman树是最优的。

[NOIP2015 提高组] 斗地主

一个很直观的想法,能够一次性出很多就出很多,不会拆成单和双,所以可以优化搜索顺序做到最优性剪枝。

[CSP-S2020] 贪吃蛇

将所有的蛇按从大到小排序,记为 \(a_1,a_2\dots a_n\) ,考虑 \(a_1\) 会不会吃。
\(a_1\) 吃了蛇之后会变成 \(a_1-a_n\) ,因为 \(a_1\leqslant a_2,a_{n-1}\leqslant a_n\) ,所以 \(a_1-a_n\leqslant a_2-a_{n-1}\) ,所以 \(a_1\) 吃了 \(a_n\) 之后只要不是最后一个就不会再被吃掉,因为 \(a_2-a_{n-1}\) 会一直在它的后面。
用两个双端队列维护数组即可,只是需要特判最后一次即可。

反证法

用反证法证明策略是对的。

[NOIP2010 提高组] 关押罪犯

将所有的罪犯矛盾关系从大到小排列,最终的答案必然是第一个不能在满足两个监狱关系的囚犯。
如果不是这样情况能是答案更优,则这对囚犯也能放在不同的监狱且比它大的也都可以,与它是第一对不能满足关系的矛盾。

调整法

证明答案不断调整不会变劣,并且调整方向固定。

[NOIP2012 提高组] 国王游戏

对于某两个大臣,假设他们左右手的数分别是 \(a_i,b_i\) 和 \(a_{i+1},b_{i+1}\) ,他们前面的所有大臣的左手的树的乘积为 \(D\) 。
他们两个交换前后的贡献分别是 \(\max(\frac{D}{b_i},\frac{D\times a_i}{b_{i+1}})\) 和 \(\max(\frac{D}{b_{i+1}},\frac{D\times a_{i+1}}{b_i})\) 。
现在我们要比较它俩大小,两边同时乘 \(\dfrac{b_ib_{i+1}}{D}\) 得到 \(\max(b_{i+1},a_ib_i)\) 和 \(\max(b_i,a_{i+1}b_{i+1})\) 。
因为 \(1\leqslant a_i,a_{i+1}\) ,所以 \(b_{i+1}\leqslant a_{i+1}b_{i+1},b_i\leqslant a_ib_i\) 。
所以最终答案等价于比较 \(a_ib_i\) 和 \(a_i+1b_i+1\) ,所以 \(a_ib_i\) 较大的应该放在后面才能使答案更优。

小结

为什么贪心难,因为你看不出来它是贪心,所以需要对数据有一定的敏感性,多观察性质。

标签:frac,策略,max,times,ib,小结,leqslant,贪心
From: https://www.cnblogs.com/Xun-Xiaoyao/p/16919521.html

相关文章

  • ABC_214E Packing Under Range Regulations(贪心模拟)
    ABC214EPackingUnderRangeRegulations(贪心模拟)PackingUnderRangeRegulations给出\(n\,(1\len\le2e5)\)个区间限制\([l,\;r]\),表示在编号为\([l,\;r]\)的......
  • 软件设计模式白话文系列(十四)策略模式
    1、模式描述定义一个算法的系列,将其各个分装,并且使他们有交互性。策略模式使得算法在用户使用的时候能独立的改变。在Java中,从JDK1.8开始支持函数式编程,就是策略模式......
  • 最小生成树之普利姆算法与克鲁斯卡尔算法(贪心算法)
    最小生成树(贪心算法)概念一个有n个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有n个结点,并且有保持图连通的最少的边。连通图有多种连接方式,而其中......
  • C/C++语言学习的策略
    断章取义C语言出现50年了,有很多内容已过时,至少有百分之二十的内容没有实用价值。C++更过份,对程序员来说,至少有百分之七十的内容没有实用价值。Linux系统也是,命令上千个,对程......
  • Spring Cloud LoadBalancer 如何指定服务使用指定负载均衡策略
    当系统中有多个服务A,B,C时默认使用轮询策略当我们A服务需要使用指定IP策略时只需要在springboot代码中使用注解@LoadBalancerClients(value={@LoadBalancerClient......
  • git学习小结1--gitee
    最近领导让把公司托管平台由svn切换到git,以前也用过git,但是没有系统的了解,正好借助这次把git好好玩玩。一、选择什么样的托管平台?  目前世界上比较出名的开源项目托管......
  • 生成树的一个小结论
    对于一张图,若已经建出了一棵生成树,然后考虑一条非树边是否能够替换一条树边。结论就是一条非树边\((x,y)\),只能替换树上路径\((x,y)\)上的任意一条边。二级结论,可以免......
  • c语言的钩子与C++的策略模式
    1.c语言钩子:特性模块:功能函数,调用注册函数主线模块:注册函数,定义钩子(通常是全局变量),调用钩子 2.c++策略模式:特性模块:从策略基类派生一个新特性类,实例化对象并调用se......
  • linux上部署皕杰报表小结
    最近需要在一个服务器上部署皕杰报表,连接的是mysql的库。步骤如下:1.首先先下载jdk,配置相应的Java环境。2.下载mysql,上官网下载相应的rpm包。3.安装好mysql后,使用dbeaver工具......
  • [转]背包问题的贪心求解
    题目有一个背包,背包容量是M=150。有7个物品,物品可以分割成任意大小。要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。思路具有最优子结构性质和贪心选择性......