鉴于tarde这道题正解过于好写,导致我对这个诡异的贪心的正确性产生了疑问,所以花了2h的时间与同机房神犇M-Blanca,Midoria7,goote~进行讨论,最后与goote~犇犇各得出了一个正确性证明:

  1. 贪心算法步步最优的证明:

    新加入一个值k,它能对前面产生的贡献就是:
  • 如果前面的某个值j是商品卖出的地方,我们可以撤销这次卖出(j-i),并从新加入的地方卖出(k-i),答案增加了(k-j)。
  • 如果前面某个值j是不买不卖的地方,我们可能的贡献是k-j(在j买入,k卖出)。
  • 所以新加入的这个k对前面的最大贡献就是在1~k-1中找一个比他小的最小的j(j是卖出的地方或者是不买不卖的地方)。然后加上贡献k-j。
  • 如果要求合法的加贡献的方式,其实也就这两种,如果要求一个本来是卖出的点就j强行买入并在k卖出,那么原来的j-i的贡献消失,加上k-j的贡献,是不如直接“撤销j”,直接加上k-j的贡献来的优的。
  • 而加入小根堆中的数只会是可撤销的或是不买不卖的,所以自动就维护出最小了,直接转移一定是最优解。

2.步步最优推向全局最优:

我们注意到,对于一种最优情况,在它后面再加入一个新数产生贡献的时候,产生的最大贡献根据上面是一定的。对于1~k-1的划分方式,我们根据上面的贪心算法,买~卖关系已经是一定的了,但是我们想到对于一个不那么优的买~卖关系划分方式,可能加贡献加的更多(因为有可能有一些较小的点由卖出的变成了不买不卖的了,从而使新加的值减去他贡献更大),这样的答案会更优吗(即经典的贪心局部最优是否是全局最优)。

  • 根据goote犇犇的说法:切换成非最优分配方式会使减数不变或增大而导致不会出现更优解。

什么意思呢?

就是每一种分配方式的答案一定是这里面的卖出的点的值的和作为被减数,买入的点的值的和作为减数,然后这样一减出答案。

而局部最优解中一定是能保证该区间内被减数-减数的值是最大的。

如果切换配对方式,那么可能有的买入点变成了卖出点,而卖出点反而变成了买入点,这样会导致被减数减小,而减数增大(因为之前满足最优,那一定是被减数-减数结果最大的情况),然后这时候我们新加一个点k。

  • 如果k足够大,就把k放进被减数的集合里,这时候在前面找一个数j与他匹配,j加入减数集合。这时候,j要么是最优解减数集合中的一个减数,要么是比最优解减数集合中的任何一个减数都大,(这个最优解一定会囊括所有的小减数,所以可以认为最优解集合中的减数是所有可能中最小的),根据刚才的结果,我们得出较劣解转移过来的减数集合是不会比最优解转移过来的减数集合小的,而被减数集合较劣解也不会比最优解大,所以最后的答案较劣解是不可能大于最优解的。
  • 如果k很小,那根本没法把他放进被减数集合里,那当前答案没有被更新,显然最优解也是更优的。

    综上所述,局部最优解转移过来的还是最优的,那么就是全局最优辣!

trade可撤销贪心正确性证明的更多相关文章

  1. 种花 [JZOJ4726] [可撤销贪心]

    Description 经过三十多个小时的长途跋涉,小Z和小D终于到了NOI现场——南山南中学.一进校园,小D就被花所吸引了(不要问我为什么),遍和一旁的种花园丁交(J)流(L)了起来. 他发现花的摆 ...

  2. SGU 280.Trade centers(贪心)

    SGU 280.Trade centers 解题报告 题意: n(<=30000)个城市,(n-1)条道路,求最少需要选择多少个城市建造市场,使得所有城市到任意一个市场的距离不大于k. Solu ...

  3. HDU 1009 FatMouse' Trade(简单贪心 物品可分割的背包问题)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1009 FatMouse' Trade Time Limit: 2000/1000 MS (Java/O ...

  4. 带撤销贪心——cf1148F好题

    自己不会做,看了题解懂得 从最高位依次往低位遍历,因为偶数个1是不改变符号的,所以带个贪心即可(可以看成是带撤销的..) 每轮循环用sum记录该位选择1可以减少的值 如果是负数,就不要改成1 如果是正 ...

  5. HDU 1009 FatMouse' Trade(简单贪心)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1009 FatMouse' Trade Time Limit: 2000/1000 MS (Java/O ...

  6. bzoj4278[ONTAK2015]Tasowanie & bzoj1692[USACO 2007Dec]队列变换(Best Cow Line) 贪心正确性证明

    做法网上到处都有就不说了. 这题其实是之前做的….不过由于人太傻现在才想明白比较字典序进行贪心的正确性…. 方便起见,在两个串的最右端都加上很大但不相同的字符,避免第lcp+1个字符不存在的边界. 如 ...

  7. HDU 1009:FatMouse&#39; Trade(简单贪心)

    FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  8. [CSP-S模拟测试]:trade(反悔贪心)

    题目传送门(内部题62) 输入格式 第一行有一个整数$n$.第二行有$N$个整数:$a_1\ a_2\ a_3\cdot\cdot\cdot a_n$. 输出格式 一行一个整数表示最大收益. 样例 样 ...

  9. 模拟费用流 & 可撤销贪心

    1. CF730I Olympiad in Programming and Sports 大意: $n$个人, 第$i$个人编程能力$a_i$, 运动能力$b_i$, 要选出$p$个组成编程队, $s ...

随机推荐

  1. synchronized的实现原理——锁膨胀过程

    @ 目录 前言 正文 偏向锁 轻量锁 批量重偏向 批量撤销 重量锁 总结 前言 上一篇分析了优化后的synchronized在不同场景下对象头中的表现形式,还记得那个结论吗?当一个线程第一次获取锁后再 ...

  2. Javaweb中的请求路径的相关总结

    重定向和转发相对路径和绝对路径问题 ​ 注意:转发和重定向的URLString前有加 / 为绝对路径 反之为相对路径 1.假设通过表单请求指定的Url资源 action="LoginServ ...

  3. 【python】itchat登录微信获取好友签名并生成词云

    在知乎上看到一篇关于如何使用itchat统计微信好友男女比例并使用plt生成柱状图以及获取微信好友签名并生成词云的文章https://zhuanlan.zhihu.com/p/36361397,感觉挺 ...

  4. oracle之三手工备份与恢复

    手工备份与恢复 2.1 手工备份和恢复的命令 1)备份和还原都使用OS命令,如linux中的cp 2)恢复用sqlplus命令:recover 2.2 备份前要对数据库进行检查: 1) 检查需要备份的 ...

  5. 【吴恩达课程使用】pip安装pandas失败-anaconda各种玄学T-T-从新开始搭建环境

    [吴恩达课程使用]安装pandas失败-从新开始搭建环境 在第五课第二周的任务2中,虚拟环境缺少pandas,sklearn依赖,因为用pip比较顺手,就直接使用pip安装,结果各种anaconda环 ...

  6. SDWebImageInfo

    SDWebImage 简介 iOS中著名的牛逼的网络图片处理框架 包含的功能:图片下载.图片缓存.下载进度监听.gif处理等等 用法极其简单,功能十分强大,大大提高了网络图片的处理效率 国内超过90% ...

  7. linux 多进程

    Linux下的多进程编程初步 Linux下的多进程编程初步 多进程编程 1 Linux下进程的结构 2 Linux下的进程控制 21 僵尸进程 22 fork 23 exec 函数族 3 Linux下 ...

  8. Linux实战(16):Centos history命令进阶

    因在使用history命令是发现历史命令不同步,没有时间戳,在查看历史操作的时候很不方便,特查询了相关文档,发现可通过系统自带的logger来记录跟踪,历史命令执行的用户,时间,登录IP. vim / ...

  9. php第四天-字符串

    0x01 字符串 1.1 字符串的处理方式 在不同的语言中,字符串的处理方式不同:在C中字符串是作为字节数组处理的:在Java中字符串是作为对象处理的:而在php中则把字符串作为基本数据类型来处理. ...

  10. JVM学习(四)JVM调优

    一.调优命令 Sun JDK监控和故障处理命令有jps.jstat.jmap.jhat.jstack.jinfo jps,JVM Process Status Tool,显示指定系统内所有的HotSp ...