裂变链接

题目大意:异构体们需要使得他们彼此之间的能量值一样。记第𝑖个异构体当前𝑒𝑖的能量,每个时刻,每个异构体都可以做如下三种操作中的一种:1、传递1的能量给自己左边相邻的异构体(如果存在)。2、传递1的能量给自己右边相邻的异构体(如果存在)。3、传递1的能量给自己(摸鱼)。为了尽快的回到前线作战,异构体们希望在最短的时间内使得所有异构体的能量值一样,问最短时间。数据保证有解。操作过程中自己的能量可以变为负数

有点像均分纸牌,但是均分纸牌是每次只能移动一堆儿,这里是每个时刻,每个异构体,所以题意上就不一样

想到他们均分完成之后,一定能够全部都是ave,所以我们考虑直接判断这个数字变成ave需要多少,然后把自己的需要/多余往后一个人的哪里堆积

但是要特判断一种情况,就是当一个人比两边都要高的时候,这时候是加和,而不是取max了

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#define int long long
using namespace std;
const int N = 1e5 + 66;

int n, res, ave;
int a[N], b[N];

signed main()
{
int i;
n = read();
for (i = 1; i <= n; ++ i) a[i] = read(), ave += a[i], b[i] = a[i];

ave /= n;

for (i = 1; i <= n; ++ i)
{
if (b[i] > b[i - 1] && b[i] > b[i + 1]) res = max(res, abs(b[i] - ave));
res = max(res, abs(ave - a[i]));
a[i + 1] -= (ave - a[i]);
}

cout << res;
return 0;
}