P8365 [LNOI2022] 吃(贪心) 题解

P8365 LNOI2022 吃(贪心) 题解

算法:贪心

题目大意

给定 \(n\) 个二元组 \((a_i,b_i)\),可以任意排列 操作顺序。初始值 \(S=1\),对每个二元组二选一:

\S \\leftarrow S+b_i \\quad \\text{或} \\quad S \\leftarrow S\\times a_i \\

求最终能得到的最大 值,答案对 \(10^9+7\) 取模。


核心贪心策略推导

结论1:加法操作一定全部放在乘法之前

所有数值均为正数。

设当前值为 \(x>0\),先加后乘:\((x+b)\cdot a\);先乘后加:\(x\cdot a + b\)。

作差:

\(x+b)a - (xa+b) = b(a-1) \\

因为 \(b\ge1,a\ge1\),所以 \((x+b)a \ge xa+b\)。

推论:想要结果最大,所有加法必须排在乘法前面,操作顺序无需考虑其他排列。

结论2:\(a_i=1\) 时,必然选择加法

若 \(a_i=1\):

  • 乘法:\(S\times 1 = S\),数值无变化
  • 加法:\(S+b_i > S\)

因此所有 \(a_i=1\) 的二元组直接执行加法,累加到初始值,之后不再参与后续枚举。

结论3 :\(a_i\neq 1\) 时,至多选择一个二元组做加法 !

使用反证 法:

假设对两个不同二元组 \((a_i,b_i),(a_j,b_j)\)(\(a_i,a_j\ge2\))都执行加法,不妨设 \(b_i \ge b_j\)。

结合加法在前、乘法在后的规则,对比两种方案:

  1. 两次都加法:\(S+b_i+b_j\)
  2. 仅 \(b_i\) 加法、\(a_j\) 乘法:\((S+b_i)\cdot a_j\)

由于 \(a_j\ge2\)、\(b_i\ge b_j\):

\(S+b_i)\\cdot a_j \\ge (S+b_i)\\cdot 2 = 2S+2b_i \\ge S+b_i+b_j \\

显然第二次操作改为乘法更优。

推论 :\(a_i\ge2\) 的二元组中,最多只选一个执行加法,其余全部执行乘法。

结论4:选出最优加法项

设:

  • 预处理完所有 \(a_i=1\) 后,当前基数为 \(S\);
  • 记所有 \(a_i\ge2\) 的乘积为 \(K=\prod a_i\)。
  1. 全部选乘法:结果为 \(S\cdot K\)
  2. 选中第 \(i\) 个做加法、其余做乘法:结果为 \(\displaystyle \frac{K\cdot (S+b_i)}{a_i}\)

对比两类方案,等价于比较:

\S \\quad \\boldsymbol{vs} \\quad \\frac{S+b_i}{a_i} \\

所以:只需在所有 \(a_i\ge2\) 的二元组中,选出 \(\boldsymbol{\dfrac{S+b_i}{a_i}}\) 最大的一项作为唯一加法项,即可得到全局最大值


部分内容由 AI 润色