首页 > 其他分享 >洛谷P3161 [CQOI2012] 模拟工厂 贪心策略的思考

洛谷P3161 [CQOI2012] 模拟工厂 贪心策略的思考

时间:2024-08-01 17:31:34浏览次数:15  
标签:洛谷 P3161 选取 说明 订单 生产力 区间 贪心 CQOI2012

P3161 [CQOI2012] 模拟工厂

传送门:模拟工厂
问题描述:初始的生产力和商品分别为1和0。每一个时刻可以选择两个动作:生产力+1或者生产生产力数量的商品。现在有很多个订单,每个订单有三个部分:时间t,需要多少商品p,可以获得的价值v。现在需要决定各个时刻的动作选择,以及订单是否接取,以期获得最大收益。

本题在网上的题解有很多,但对于贪心策略的原理却鲜有说明。接下来我先介绍一下这道题的解题思路,然后简要说明贪心的原因:

订单总数最多只有15个,因此可以采用枚举的方式,遍历所有订单的选取情况,分别判断其可满足性,最终选取满足条件且使收益最大的订单选取情况。

枚举订单情况可以采用类似状态压缩的方法,也即遍历0~2^15-1,二进制数中的0和1表示订单选取情况。接下来主要讨论如何判断某一种订单选取情况是否满足条件。

对于某个订单选取情况,首先需要将选取的订单按照时间进行从小到大排序,然后从前往后处理。所有的题解都说明了下面这个推导式:假设当前生产力是M,当前订单距离下一个订单所需时间为T,要接取这个订单需要额外生产P个商品。假定在这个区间内我们选择长度为x的时间进行提高生产力(显然在小区间内,提高生产力的时间往前面放一定是更优的,因为这可以最大化这段区间内生产商品的数量),那么前x长度时间将生产力提升到(M+x),而后(T-x)时间生产了(M+x)(T-x)数量的商品。可得如下不等式:

\[(M+x)(T-x)\ge P \]

\[x^2+(M-T)x+P-M\cdot T\le0 \]

假如这个不等式无解,说明不可能满足订单;如果有解,则在解区间内部选择最大的解x以尽可能提升生产力,x取值为:

\[\lfloor\frac{T-M+\sqrt{(M+T)^2-4P}}{2}\rfloor \]

ps: 如果这个结果是一个负数,那么也说明无法满足该情况的解。有没有可能这个结果并不落在解区间内部?从方程来看有可能,因为解区间内部可能没有整数;但就本题而言,不存在该情况:因为两根之差为\(\sqrt{(M+T)^2-4P}\),由于MTP都是整数,根号内部一定是整数,因此不会为(0,1)内的小数。

上面的描述中有一个疑点:为什么要尽可能提升生产力?这个问题之后会解释。先把算法整体描述清楚。

对于遍历到的某个具体的选取订单而言,根据其下一个订单利用上述公式解出x是否就行了?并不是,因为这个x有可能会导致后续的订单无法满足,也即将公式中的T和P更换成后续订单的数据可能导致x位于解区间右端点的右侧,也即该x对于后续订单来说偏大了。因此,需要对所有的后续订单都利用上式计算出一个端点,然后选取其中最小的作为当前订单后可以用于提升生产力的时间x。(T更新成到后续某个订单的时间,而P更新成到这个订单包括中间所有订单的商品总数)假如这个x解出来发现是负数(方程无解也返回一个负数),则说明订单无法满足。

最后来说明上述的贪心策略:为何要使得x在可取的范围内尽量大。首先,上述约束条件(x<=所有方程的右根)仅仅保证了x对于任何后续订单来说不会生产力过大导致商品不足,但并没有说x满足后续所有的方程,也即当前选取的x很有可能会处于后续方程的解区间左端点以左,也即x可能偏低,即对于后续的某一个订单而言,在当前提升了x的生产力后,可能出现生产力不足导致商品不足的情况(当前进一步提升生产力可以提高到该订单处的商品总数)。因此在合理范围内最大化生产力x,可以最大程度缓解后续可能出现的生产力不足带来的商品不足问题,并且也保证已经能够满足的订单不受影响。

以上为本人对本题贪心策略的思考,欢迎各位批评指正。

标签:洛谷,P3161,选取,说明,订单,生产力,区间,贪心,CQOI2012
From: https://www.cnblogs.com/z-xiang/p/18337084

相关文章

  • 洛谷题单指南-前缀和差分与离散化-P3029 [USACO11NOV] Cow Lineup S
    原题链接:https://www.luogu.com.cn/problem/P3029题意解读:不同的坐标位置有不同种类的牛,要计算一个最小的区间,包括所有种类的牛。解题思路:由于坐标位置不连续,并且数值范围较大,因此需要离散化处理,将坐标处理成1~n连续分布由于种类编号数值范围也比较大,也需要离散化处理,去重后的......
  • 洛谷P2801 教主的魔法之分块板子
    洛谷P2801题解传送锚点摸鱼环节教主的魔法题目描述教主最近学会了一种神奇的魔法,能够使人长高。于是他准备演示给XMYZ信息组每个英雄看。于是\(N\)个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为\(1,2,\ldots,N\)。每个人的身高一开始都是不超过\(1000\)......
  • 洛谷 B3612 【深进1.例1】求区间和
    "这道题也太水了吧,模拟就行了!""数据范围...""好像不行呀""呜呜~~TLE!"献上暴力代码!#include<bits/stdc++.h>usingnamespacestd;constintN=1e5+5;intn,a[N],m;signedmain(){ios::sync_with_stdio(0);cin.tie(0);......
  • 洛谷题单指南-前缀和差分与离散化-P4552 [Poetize6] IncDec Sequence
    原题链接:https://www.luogu.com.cn/problem/P4552题意解读:对一组数字序列,进行若干次区间+1或者-1操作,最终使得所有数字一样,计算最少的操作次数,以及能得到多少种不同序列。解题思路:要使得序列每一个数字都相同,则其差分除了第一项之外其余项都是0。因此,问题转化为:给定一个差分数......
  • 洛谷题单指南-前缀和差分与离散化-P2882 [USACO07MAR] Face The Right Way G
    原题链接:https://www.luogu.com.cn/problem/P2882题意解读:一个有F、B组成的序列,每次可以翻转k个连续子序列,翻转:F->B,B->F,计算最少翻转多少次可以将序列都变成F,并求相应的k。解题思路:为方便处理,设F为1,B为01、朴素做法枚举k:1~n  枚举序列,一旦遇到0,就将连续k个字符翻转,如果可......
  • 洛谷P2696之慈善的约瑟夫——题解
    洛谷P2696题解[传送锚点](P2696慈善的约瑟夫-洛谷|计算机科学教育新生态(luogu.com.cn))比不过大佬,从蒟蒻做起选择比较水有意思的解法——用队列模拟(还是窝太弱了)正片开始考虑队列模拟,因为每次都是假的剔除,所以我们的目标是找到每回游戏的最终存活者。将不被剔除,......
  • 洛谷-P1171-售货员的难题
    Abstract传送门也算是状压dp模板题?不过这个数据给的有点阴间了,空间不够用,需要搞一个奇妙的优化。idea所谓状压,就是用数字表示当前状态,比如说0110100这个数字,我们可以把01分别看作是是否到达过第i个点的标记。那么我们可以用dp[i][j]表示第i个状态下,快递员到达j......
  • 洛谷题单指南-前缀和差分与离散化-P1083 [NOIP2012 提高组] 借教室
    原题链接:https://www.luogu.com.cn/problem/P1083题意解读:已知第i天有r[i]个教室可以供租借,有m个租借教室的订单,第i订单需要在第s[i]~t[i]天区间内租借d[i]个教室,计算是否全部订单都能满足,如果不满足要输出从第几个订单开始不满足。解题思路:1、朴素做法枚举1~m个订单,通过差分......
  • 洛谷题单指南-前缀和差分与离散化-P3406 海底高铁
    原题链接:https://www.luogu.com.cn/problem/P3406题意解读:1-n个城市共了n段路,第i段路不买卡票价a[i],买卡票价b[i](卡本身花费c[i]),给定一个路程顺序,计算最少的通行费用。解题思路:根据路程,计算每段路各走了多少次,然后对于每段路,计算买卡和不买卡两种花费,取较小的累加即可。如何......
  • 洛谷题单指南-前缀和差分与离散化-P3017 [USACO11MAR] Brownie Slicing G
    原题链接:https://www.luogu.com.cn/problem/P3017题意解读:将一个r*c的矩阵,横向切成a条,每一条纵向切除b块,计算每一块子矩阵之和的最小值最大是多少。解题思路:要计算最小值中最大的,直觉上可以采用二分,下面来分析单调性:给定一个子矩阵块之和的值,值越小可以划分的条数、块数就越多......