鉴于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. Java接口讲解

    Java中的接口其实就是一套“标准”或者“规范”,比如使用接口实现[电脑对鼠标.键盘使用USB接口的管理],鼠标和键盘他们与接口之间并不存在子类和父类的关系,但是鼠标和键盘又都要通过USB接口插入电脑 ...

  2. loadrunner做http接口的性能测试

    不用录制脚本的方法 步骤: 1.先打开Virtual User Generator——选择Web/HTTP协议,进入到主页面,这里不按照传统录脚本的方式输入url,所以直接叉掉录制脚本选项,进入下面的 ...

  3. oracle之SQL的数据类型

    SQL的数据类型 3.1 四种基本的常用数据类型(表的字段类型) 1.字符型, 2.数值型,3.日期型,4.大对象型 3.1.1 字符型:    char         固定字符,最长2000个   ...

  4. 一道JavaScript的二维数组求平均数的题

    JavaScript中只支持一维数组,但是可以在数组中嵌套数组来创建二维以至于多维的数组.今天下午在看书时候,发现一道感觉比较有意思的题,就是js中如何求二维数组的列之和和行之和,现在就给大家分享下, ...

  5. JVM--堆是分配对象的唯一选择么?

    在<深入理解Java虚拟机>中关于Java堆内存有这样一段描述:随着JIT编译期的发展与逃逸分析技术逐渐成熟,栈上分配.标量替换优化技术将会导致一些微妙的变化,所有的对象都分配到堆上也渐渐 ...

  6. Linux实战(13):Centos8 同步时间

    前言 以下操作是通过ntpdate命令实现同步 timedatectl set-timezone Asia/Shanghai # 设置时区 rpm -ivh http://mirrors.wlnmp. ...

  7. C++万能头文件的秘密

    #include<bits/stdc++.h> 万能头文件,拼写怎么这么奇怪? 其实,bits表示一个文件夹,stdc++.h是里面的头文件,这表示路径. 搜索这个文件夹,找到后打开. 打 ...

  8. Java Web学习(四)http协议

    文章更新时间:2020/07/24 一.概念 定义 HTTP:超文本传输协议,是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程. HTTP协议:用于定义客户端与 ...

  9. vsCode 搭建Java开发环境

    1.安装扩展 Java Extension Pack Spring Boot Extension Pack 2.配置Maven 打开设置 搜索maven 找到并打开  在 settings.json ...

  10. C文件读写(二进制/文本文件)整理

    目录 [TOC] 打开文件 使用fopen打开文件,在<stdio.h>头文件中,其声明如下: FILE * fopen ( const char * filename, const ch ...