..
AcWing 100. 增减序列
题目链接:100. 增减序列 - AcWing题库
求出 $a$ 的差分序列 $b$,其中 $b_1 = a_1$,$b_i = a_i - a_{i - 1} (2 \leq i \leq n)$。
令 $b_{n + 1} = 0$。
题目对序列 $a$ 的操作,相当于每次可以选出 $b_1, b_2, \cdots, b_{n + 1}$ 中的任意两个数,
一个加 $1$,另一个减 $1$。
目标是把 $b_2, b_c, \cdots, b_n$ 变为全零。
最终得到的数列 $a$ 就是由 $n$ 个 $b_1$ 构成的。
从 $b_1, b_2, \cdots, b_{n + 1}$ 中任选两个数的方法可分为四类。
- 选 $b_i$ 和 $b_j$,其中 $2 \leq i, j \leq n$。 这种操作会改变 $b_2, b_3, \cdots, b_n$ 中两个数的值。 应该保证 $b_i$ 和 $b_j$ 一正一负的前提下,尽量多地采取这种操作,更快地接近目标。
- 选 $b_1$ 和 $b_j$,其中 $2 \leq j \leq n$。
- 选 $b_i$ 和 $b_{n + 1}$,其中 $2 \leq i \leq n$。
- 选 $b_1$ 和 $b_{n + 1}$。 这种情况没有意义,因为它不会改变 $b_2, b_3, \cdots, b_n$ 的值,相当于浪费了一次操作,一定不是最优解。
设 $b_2, b_c, \cdots, b_n$ 中正数总和为 $p$,负数总和的绝对值为 $q$。
首先以正负数配对的方式尽量执行第 $1$ 类操作,可执行 $\min(p, q)$ 次。
剩余 $\lvert p - q \rvert$ 个未配对,每个可以选与 $b_1$ 或 $b_{n + 1}$ 配对,即执行第 $2$ 或第 $3$ 类,共需 $\lvert p - q \rvert$ 次。
综上所属,最少操作次数为 $\min(p, q) + \lvert p - q \rvert = \max(p,q)$ 次。
根据 $\lvert p - q\rvert$ 次第 $2$、第 $3$ 类操作的选择情况,能产生 $\lvert p - q \rvert + 1$ 种不同的 $b_1$ 的值,
即最终得到的序列 $a$ 可能有 $\lvert p - q \rvert + 1$ 种。
完整代码:增减序列.cpp