时间复杂度
O
(
n
l
o
g
n
+
k
2
)
O(nlogn + k ^ 2)
O(nlogn+k2)
思路
我们首先可以想到,最大的情况就是
k
=
=
n
/
2
k == n / 2
k==n/2
∑
i
=
1
n
−
k
∣
A
[
i
]
−
A
[
i
+
k
]
∣
=
a
[
n
]
−
a
[
1
]
\sum_{i=1}^{n - k} |A[i] - A[i + k]| = a[n] - a[1]
i=1∑n−k∣A[i]−A[i+k]∣=a[n]−a[1]
我们可以分成两组长度为 n / k 和 n / k + 1,为什么是这两组。因为这两组可以组成 n,也就是 i, i + k, i + 2k, i + 3k...... 一组,使得求和小
现在思考,如果我们遵从上面的想法,让他求和小,那么我们要怎么样才能算出
s
u
m
sum
sum。我们发现,对于
s
u
m
sum
sum 我们只是把
a
[
1
]
~
a
[
n
]
a[1] ~ a[n]
a[1]~a[n] 中的一部分断开,也就是
a
[
i
+
1
]
−
a
[
i
]
a[i + 1] - a[i]
a[i+1]−a[i] 会因为我们的分组而消失,那么我们为了让
s
u
m
sum
sum 小,我们就应该让断开的部分尽可能的大。
现在问题变成了我们从
n
n
n 长度的数列中,选取两种子串排满整个数列,数列1的个数为 n % k 长度为 n / k + 1,数列2的个数为 k - n % k 长度为 n / k,如何选择使得断开的差尽可能大