P16875 [GKS 2022 #B] Unlock the Padlock

题目描述

假设你有一个密码锁,它由 $N$ 个拨盘组成,初始时设置为随机组合。密码锁的拨盘大小为 $D$,即每个拨盘的值可以是 $0$ 到 $D-1$(包含两端),并且可以向上或向下旋转。拨盘从左到右排列,最左和最右的位置分别为 $1$ 和 $N$。将所有的拨盘值设为 $0$ 即可打开密码锁。 你可以执行零次或多次以下操作: - 选择任意区间 $[l, r]$,满足 $1 \le l \le r \le N$,并将该区间内的所有拨盘同时向上或向下旋转。向上旋转会使区间 $[l, r]$ 中每个拨盘的值增加 $1$,向下旋转则减少 $1$。注意,值为 $D-1$ 的拨盘向上旋转后会变成 $0$,值为 $0$ 的拨盘向下旋转后会变成 $D-1$。 操作序列必须满足以下条件: - 第 $i-1$ 次操作选择的区间 $[l_{i-1}, r_{i-1}]$ 必须完全包含在第 $i$ 次操作选择的区间 $[l_i, r_i]$ 之内,即 $l_i \le l_{i-1} \le r_{i-1} \le r_i$。第一次操作 $([l_1, r_1])$ 可以任意选择。 解锁初始组合为 $[1, 1, 2, 2, 3, 3]$ 的密码锁的有效操作序列示例: 1. 将区间 $[5, 6]$ 向下旋转。 2. 将区间 $[3, 6]$ 向下旋转。 3. 将区间 $[1, 6]$ 向下旋转。 以下是一些不能执行的操作: 1. 在 $[6, 9]$ 之后旋转 $[1, 4]$,因为 $[6, 9]$ 没有完全包含在 $[1, 4]$ 中(不满足 $r_{i-1} \le r_i$,其中 $r_{i-1}=9$,$r_i=4$)。 2. 在 $[2, 7]$ 之后旋转 $[3, 6]$。 你的目标是输出使密码锁所有拨盘归零所需的**最少**有效操作次数。

输入格式

输入的第一行包含测试用例的数量 $T$。接下来有 $T$ 个测试用例。 每个测试用例由 $2$ 行组成。 每个测试用例的第一行包含 $2$ 个整数 $N$ 和 $D$,分别表示密码锁的拨盘数量和拨盘的大小。 每个测试用例的第二行包含 $N$ 个整数 $V_1, V_2, \ldots, V_N$,其中第 $i$ 个整数表示初始组合中第 $i$ 个拨盘的值。

输出格式

对于每个测试用例,输出一行,格式为 `Case #x: y`,其中 $x$ 是测试用例编号(从 $1$ 开始),$y$ 是解锁密码锁所需的最少操作次数。

说明/提示

在样例 #1 中,解锁密码锁所需的最少操作次数为 $3$。可以使用以下操作解锁: 1. 将区间 $[4, 4]$ 向下旋转。 2. 将区间 $[3, 5]$ 向下旋转。 3. 将区间 $[1, 6]$ 向下旋转。 在样例 #2 中,解锁密码锁所需的最少操作次数为 $2$。可以使用以下操作解锁: 1. 将区间 $[3, 4]$ 向上旋转。 2. 将区间 $[2, 6]$ 向下旋转。 ### 限制条件 $1 \le T \le 100$。 对于所有 $i$,$0 \le V_i \le D - 1$。 **测试集 1** $1 \le N \le 40$。 $D = 2$。 **测试集 2** $1 \le N \le 40$。 $2 \le D \le 10$。 **测试集 3** $1 \le N \le 400$。 $2 \le D \le 10^9$。 翻译由 DeepSeek V4 Pro 完成