鉴于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. 原生js实现jquery的siblings()

    Element.prototype.siblings = function(callback){ var siblingElement = []; var parentAllElement = []; ...

  2. Android组件化 + MVP + MVVM

    前言 组件化和插件化已经提出了很久了,到现在也是比较稳定的一种架构方案了,在三年前,组件化和插件提出来没多久,前公司就已经在项目中使用了,只是当时还只是菜鸟,没有资格参与到架构的建设中,只是在大佬搭好 ...

  3. python中反射 getattr(对象,'方法')()和hasattr(对象,'方法')

    getattr(对象,'方法')():从一个对象里面找到里面的方法,,, 传了一个对象,再传一个字符串,就能找到这个字符串的方法 hasattr(对象,'方法') 判断这个对象里面有没有这个方法,返回 ...

  4. ctfhub sql注入字符型

    手工注入 1, 检查是否存在注入 2.猜字段数.列数 3.获得注入点,数据库名称,数据库版本 4.获得表名 5.获得字段名 6.获得flag sqlmap方法 1.查数据库库名 2.查表名 3.查字段 ...

  5. 3.CDN加速简介

    什么是CDN CDN的全称是Content Delivery Network,即内容分发网络.CDN的基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中,在用户访问 ...

  6. Linux实战(11):Centos安装Jenkins

    前言 本文采用的是yum安装方式. 环境安装 以下操作为配置java8,node,maven,注意装之前请将其他版本删除干净, 离线包下载 tar -zxvf apache-maven-3.6.3-b ...

  7. Ansible基础认识及安装(1)

    Ansible简介 ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统配置.批量 ...

  8. CTF-BugKu-WEB-1-20

    2020.09.17 全面复习web,给自己定个目标,后天之前结束BugKu-Web,开始逆向. 经验教训 php弱等于用于绕过==,弱等于之前会把等号两边转化为同一类型变量: 全局变量全局变量全局变 ...

  9. 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统二 | 简单的分库分表设计

    教程预览 01 | 前言 02 | 简单的分库分表设计 03 | 控制反转搭配简单业务 04 | 强化设计方案 05 | 完善业务自动创建数据库 06 | 最终篇-通过AOP自动连接数据库-完成日志业 ...

  10. 关于Apache报错 couldn't perform authentication. AuthType not set!

    今天在使用apache搭建yum的web服务时,配置完成后.访问http://ip 时,浏览器报错:500 Internal Server Error 然后查询error.log发现,有如下错误提示: ...