专栏文章
NOIP 2025 T2 清仓甩卖 题解
个人记录参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mimx4gdf
- 此快照首次捕获于
- 2025/12/01 16:59 3 个月前
- 此快照最后确认于
- 2025/12/01 16:59 3 个月前
NOIP 2025 T2 清仓甩卖 题解
题目概览
题目难度:省选/NOI-
知识点:组合数学;双指针;枚举
简要题意
有 颗糖果,其中第 () 颗糖果的原价为 元。设第 () 颗糖果的清仓价格为 元,则它的性价比被定义为 。
小 R 带了 元钱买糖果。采用了以下购买策略购买糖果:将所有糖果按照性价比从大到小排序,然后依次考虑每一颗糖果。若他在考虑第 () 颗糖果时剩余的钱至少为 元,则他会购买这颗糖果;否则他会跳过这颗糖果,继续考虑下一颗。特别地,若存在两颗糖果的性价比相同,则他会先考虑原价较高的糖果;若存在两颗糖果的性价比与原价均相同,则他会先考虑编号较小的糖果。
在所有 种定价方案中,有多少种定价方案使得按照上述购买策略能购买到的糖果的原价总和最大。求出满足要求的方案数对 取模。
多组测试数据,设 为单个测试点内所有测试数据的 的和。对于所有测试数据,均有:
- ;
- ,,;
- 对于所有 ,均有 。
题解
观察小 R 购买的贪心策略,他一定是先买了前面连续的一段糖果,买到第 颗糖果时钱不够了。要想造成他购买的与最优方案不符,只能是在决策第 颗糖果是剩余 元,此时他会等到下一个 元糖果 的出现,此时最优答案可能是把最后买到的 元糖果 和之前买过的一个 元糖果 删除,替换成 元糖果 ,即满足条件 。
我们不用真正计算性价比并排序,而是根据原价 排序,可以把排序后的序列分成三个部分:( 是部分 C 的左端点,稍后介绍求法)
- 部分 A:第 个糖果至第 个糖果
- 部分 B:第 个糖果至第 个糖果
- 部分 C:第 个糖果至第 个糖果
三个部分糖果特点如下:
- 部分 A:都一定是在第 颗糖果之前购买
- 部分 B:若 ,则是在 之前购买;若 ,则是在 之后购买
- 部分 C:都一定是在第 颗糖果之后购买
下面确定 B,C 的分界。依据部分 B 糖果的特点,B 中的糖果 满足:,可转化为 ,如果该式不成立就是部分 C,所以部分 C 的左端点 lim 可以用指针寻找第一个小于等于 的 。
对于枚举的每一个 ,开始计算总方案数。
较为容易的是糖果 后面的部分,可以任选价格,记本段长度 ,方案数为
设 为 A 中 的糖的个数, 为 B 中 的糖的个数。
决策糖果 时还剩 元,所以在这之前一共画了 元,可以列出等式 ,可以转化为 ,AB 部分中共有 颗糖果,所以总方案数是 。
但不要忘记,满足 就能判定为不合法,所以我们可以尝试求出合法的方案数,用总方案数减去合法方案数求不合法方案数。
可以发现,我们能在部分 B 中把第 颗糖果的价值调整为 1,之前说过,一旦调整为 就意味着这颗糖果会在 之前被卖,就有可能作为上面式子中的 。还可以把刚刚的式子转化为 ,推断随着 的不断增大, 不断增大, 取值的上界会越来越宽松,所以可选的 就是部分 B 的一段后缀,且左端点 在 的增大中越来越靠左,同样可以用指针维护左端点 。
记可选 的区间长度为 ,只有可选 区间里都填 才能合法,所以合法的方案数为 。
所以不合法方案数为 。
最终答案就是用总方案数 减去不合法方案数:
。
代码
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...