专栏文章

题解:P14636 [NOIP2025] 清仓甩卖 / sale(民间数据)

P14636题解参与者 2已保存评论 2

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
2 条
当前快照
1 份
快照标识符
@mimyjtjk
此快照首次捕获于
2025/12/01 17:39
3 个月前
此快照最后确认于
2025/12/01 17:39
3 个月前
查看原文
个人体感上蓝下紫。
考虑我们什么时候会算错。
按原价从大到小排序,以下认为前面代表大,后面代表小。
首先这个按性价比选,看起来其实是一种很优的贪心策略,通过手模,我们发现算错当且仅当你现在剩两块钱,有一个没选的赋值为 22 的数,比接下来两个没选的赋值为 11 的数更优,但性价比不如第一个没选的赋值为 11 的数。设这三个数分别为 a,b,ca,b,c,那么这三个数需要满足以下条件:
  • a>b+ca > b+c
  • 2×a<b2 \times a < b
于是枚举 a,ba,b,我们发现满足条件的 cc 是一段后缀,而 cc 后面的所有数都可以选或不选,假设后面长度为 lenlen,贡献就是 i=0len2i=2len+11\sum\limits_{i=0}^{len} 2^i=2^{len+1}-1
再观察,枚举 a,ba,b,我们发现 cc 取值是单调的,于是我们类似双指针那样搞一下。
接着考虑我们开局有 mm 元,我们要用掉剩下的 m2m-2 元。通过观察,首先我们发现 aa 一定在 bb 前面,其次是 aa 前面的数定价 1/21/2 都会被买,aabb 中间的数定价 11 会被买而 22 不会,我们让前面的 1/21/2 整体减 11,问题变成了在中间这么多位置中选出固定个数个位置变成 11,预处理组合数即可。
时间复杂度 O(n2)O(n^2),代码等出来贴。

评论

2 条评论,欢迎与作者交流。

正在加载评论...