0%

影石Insta360杯 2025牛客暑期多校训练营10——[E] Sensei and Affection(使得数组趋同,所需要的最少区间+1操作数量。)

题目大意

使得数组趋同,所需要的最少区间加一操作数量。

题目描述

给定 nn 个学生的初始好感度序列 a1,a2,,ana_1, a_2, \dots, a_n
每天可以且必须进行一次操作:选择一个区间 [l,r][l, r] (1lrn1 \le l \le r \le n),将该区间内所有学生的好感度加 1(即对于所有 lirl \le i \le r,执行 ai:=ai+1a_i := a_i + 1)。
求使得最终序列中最多出现 mm 种不同数值所需的最小操作次数(最小天数)。

输入描述

第一行包含一个整数 TT (1T101 \le T \le 10),表示测试数据组数。
对于每组测试数据:
第一行包含两个整数 n,mn, m (1n400,1m21 \le n \le 400, 1 \le m \le 2),分别表示学生数量和允许的最大不同数值种数。
第二行包含 nn 个整数 a1,a2,,ana_1, a_2, \dots, a_n (0ai1000 \le a_i \le 100),表示初始好感度。

输出描述

对于每组测试数据,输出一行一个非负整数,表示所需的最小操作次数。

样例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
输入
4
3 1
3 1 3
5 1
5 1 6 1 8
5 2
5 1 6 1 8
5 2
1 3 2 3 1

输出
2
12
3
1

样例解释

第一组数据 (n=3,m=1n=3, m=1):
初始序列为 [3, 1, 3],目标是让所有数字相同(最多 1 种数值)。

  1. 选择区间 [2,2][2, 2] 进行操作,序列变为 [3, 2, 3]

  2. 再次选择区间 [2,2][2, 2] 进行操作,序列变为 [3, 3, 3]
    共需 2 次操作,序列中只有数值 3,满足条件。

第三组数据 (n=5,m=2n=5, m=2):
初始序列为 [5, 1, 6, 1, 8],目标是让序列中最多只有 2 种不同的数值。
最小需要 3 次操作。

思路讲解

首先我们注意到一件事情,就是这个 M 等于一或者 M 等于二。说白了要么变成同一个数,要么变成两个数。

我是这么感觉的,修改一个数,就是把所有的值修改为最大值。修改两个数其实也简单。修改两个数就是一个最大值,一个次大值,然后把其他的值都修改为次大值就好了。

上面就是我的感觉啊,我们先尝试一下,看看对不对。先尝试手磨一下样例。

不,手磨样例以后,我们发现把所有值修改为最大值,在只修改一个数的时候应该是对的。但是修改两个数的时候,这个情况就比较复杂了。修改两个数的话,我们之前的想法应该是错的。只有一个是对的,就是应该就是先要把这些数,其中的一些数肯定是要变为最大值的,其中的一些数肯定是要变为最大值的。但是至于另外一个值需要怎样取,就比较麻烦了。

OK 啊,偷偷看了一眼题解,这个题解写的还是可以的。比这垃圾 AI 提示写的好。这 AI 提示,我告诉他我的思路,我干脆比不告诉他我的思路还好,写的还好一点。这真的纯纯傻逼,还不如不写。

M 等于一的情况,一种比较方便的实现方法呢,就是直接选择一个极长段,这个极长段中的所有数都比最大值小。不断地选择这样的极长段进行操作,记录一下找不到这个这样子的极长段所需要的操作数量。说白了,这个做法就是一个贪心。