BZOJ 3709&&AGC 018 C——多段排序的微扰法
BZOJ 3709
• 有n只怪物,你的初始生命值为z。
• 为了打败第i只怪物,你需要消耗cost[i]点生命值,但怪物死后
会使你恢复val[i]点生命值。
• 任何时候你的生命值都不能小于等于0。
• 问是否存在一种打怪顺序,使得你可以打完这n只怪物而不死掉
• n≤100,000
一些怪物是赚血的,一些是亏血的。
肯定要先打完所有赚血的,再打亏血的。
打赚血的:
为了保证能够有血,先打cos小的最保险。
微扰法证明:如果先打大一些的,如果能打,那么打小一些的也能打,而且血更多了,一定还能打那一个大的。
所以,先打小的一定不劣。
打亏血的:
为了保证能够有血,先打val大的最保险。
微扰法证明:为什么会出现一个方案能打,而另一个方案就打着打着就挂了呢?
一定有:life-cos1+val1-cos2<0并且life-cos2+val2-cos1>0
(显然,如果life-cos1<0且life-cos2>0的比较是没有必要的。因为处于减血的阶段,cos1就无论如何打不了了)
(所以只能是打了前一个,然后后一个不能打了)
即:life-cos2+val2-cos1>life-cos1+val1-cos2
那么,就有:val2>val1
并且,打1再打2和打2再打1之后的血量一致,不影响后面的。(也是微扰法的适用条件之一)
所以,当一个怪物的val更大的时候,先打它一定不劣。
用堆维护即可。
AGC 018 C
• 有X+Y+Z个人,每个人有Ai个金币,Bi个银币,Ci个铜币。现在
选X个人提供金币,Y个人提供银币,Z个人提供铜币。
• 求最多提供多少币。
• X+Y+Z≤100,000
话说直接跑费用流应该能过吧(虽然太暴力)
考虑如果只有金币银币。
如果1提供金币,2提供银币比换过来更优的话,有:A1+B2>A2+B1
A,B即金币银币。
移项:A1-B1>A2-B2
所以,按照A1-B1排序,前X个提供金币,后Y个提供银币。
现在加入铜币。
之前的努力不能白费。
所以我们在按照Ai-Bi排好序的数组上进行。
枚举一个分界点,i
[1,i]用A,C来填,[i+1,X+Y+Z]用C,B来填。
两半分别用刚才的类似的排序方法求出来答案。
可以用堆维护到logn
为什么是对的?
对于我们填好的一个方案:ACACC|BBBCBB
'|'代表分界点
1.由于按照Ai-Bi排好序,所以,A和B交换不优。
2.由于分界点内部是按照Ai-Ci,Bi-Ci排序的,所以内部的A,C和B,C交换已经考虑过。
3.如果A跨过分界点和一个C交换,ACCCC|BBBABB,那么由于按照Ai-Bi排好序,所以换成ACCCC|ABBBBB会更优。
这个情况会在枚举下一个分界点的时候考虑到。
4.B跨过分界点和C交换同理。
所以,对于这样的排序方法,再加上枚举,一定可以遍历所有的可能成为最优解的方案。
总结:
1.猜结论
2.列出比较的式子。
3.枚举一维也是降低复杂度和思维含量的重要方法。
BZOJ 3709&&AGC 018 C——多段排序的微扰法的更多相关文章
- [PA2014] [BZOJ 3709]~[BZOJ 3719] 合集
今天起尝试做套题喵~ (当然是因为被最大流的题目弄得恶心死了) 一共是 10 道题一道一道做 预计 3~4 内做完 尽情期待 [BZOJ 3709]Bohater 一眼就能感受到贪心的气息 因为很直观 ...
- BZOJ 3709: [PA2014]Bohater
3709: [PA2014]Bohater Time Limit: 5 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 1050 Solved: ...
- 【贪心】bzoj 3709:[PA2014]Bohater
3709: [PA2014]Bohater Time Limit: 5 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 653 Solved: ...
- mysql创建外键出错(注意数据库表字段排序)
1. 两个字段的类型或者大小不严格匹配.例如,如果一个是int(10),那么外键也必须设置成int(10),而不是int(11),也不能是tinyint.另外,你还必须确定两个字段是否一个为 sig ...
- BZOJ 1697: [Usaco2007 Feb]Cow Sorting牛排序
Description 农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便于行动.因为脾气大的牛有可能会捣乱,JOHN想把牛按脾气的大小排序.每一头牛的脾气都是一个 ...
- BZOJ 2938: [Poi2000]病毒 [AC自动机 拓扑排序]
2938: [Poi2000]病毒 题意:判断是否存在无限长的不含模式串的字符串.只有01. 建出套路DP的转移图,判断有环就行了 练习一下拓扑排序 #include <iostream> ...
- [BZOJ 3709] Bohater
Description 在一款电脑游戏中,你需要打败n只怪物(从1到n编号).为了打败第i只怪物,你需要消耗d[i]点生命值,但怪物死后会掉落血药,使你恢复a[i]点生命值.任何时候你的生命值都不能降 ...
- bzoj 3709: [PA2014]Bohater 贪心
题目: 在一款电脑游戏中,你需要打败\(n\)只怪物(从\(1\)到\(n\)编号).为了打败第\(i\)只怪物,你需要消耗\(d_i\)点生命值,但怪物死后会掉落血药,使你恢复\(a_i\)点生命值 ...
- bzoj 3012: [Usaco2012 Dec]First! Trie+拓扑排序
题目大意: 给定n个总长不超过m的互不相同的字符串,现在你可以任意指定字符之间的大小关系.问有多少个串可能成为字典序最小的串,并输出这些串.n <= 30,000 , m <= 300,0 ...
随机推荐
- 接口自动化·分享·第二篇·你必须了解的HttpRequest和HttpResponse
完成一个接口调用其实就是完成了一次http请求,所以你必须要清楚一个http请求的组成. 一次完整的请求包含:请求+响应. 一.HttpRequest请求对象 要调用一个接口,首先要准备的是一个请求对 ...
- Siki_Unity_2-2_NGUI_UI插件学习(3.6.8版本)(未学)
Unity 2-2 NGUI UI插件学习(3.6.8版本)(未学)
- Spark之编程模型RDD
前言:Spark编程模型两个主要抽象,一个是弹性分布式数据集RDD,它是一种特殊集合,支持多种数据源,可支持并行计算,可缓存:另一个是两种共享变量,支持并行计算的广播变量和累加器. 1.RDD介绍 S ...
- AirSim的搭建和使用
由于自己使用设备拍摄的数据质量太差,所以决定使用AirSim这个框架来生成数据.之所以使用这个框架,是因为之前同事用其生成了一些有效数据. 当然,我是不可能把我搭建的步骤一一写出来的,一来是因为太麻烦 ...
- SQL判断是否存在
判断数据库是否存在 ifexists(select*frommaster..sysdatabaseswherename=N’库名’) print’exists’ else print’notexist ...
- 用了这么多年的MCU,你知道哪些MCU原厂最牛?
单片机诞生于1971年,经历了SCM.MCU.SoC三大阶段.单片机由以前的1位.4位.8位.16位,发展到现在的32位甚至64位. 90年代后随着消费电子产品大发展,单片机技术得到了巨大提高,相继诞 ...
- 20181016-4 Alpha阶段第1周/共2周 Scrum立会报告+燃尽图 02
此次作业要求参见 [https://edu.cnblogs.com/campus/nenu/2018fall/homework/2247] Scrum master:祁玉 一.小组介绍 组长:王一可 ...
- 《我是IT小小鸟》阅读心得
虽然读这本书是老师布置的作业,但是读了几页后就被书中的内容所吸引住了.或许是因为我也是学这个专业的,所以书中的一些内容让我觉得非常的有兴趣.作为一个学习软件工程的大一学生还没真正的认识到这个专业的深奥 ...
- iOS-封装UIPickerView
创建类WJPickerView继承与UIView ProvinceModel是省市的model,包含属性 @property (nonatomic, strong) NSString *provinc ...
- jdbc 5.0
1.事务 事务将单个SQL语句或一组SQL语句视为一个逻辑单元,如果任何语句失败,整个事务将失败. jdbc的MySQL驱动程序中的事务默认是自动提交. 默认情况下,每个SQL语句在完成后都会提交到数 ...