题意: 给定
n
n
n个盒子,每个盒子有
a
i
a_i
ai个物品,问你至少需要往这些盒子中添加多少个物品,才能使得无论选择哪一个盒子
i
i
i,将
a
i
a_i
ai分给剩余
n
−
1
n-1
n−1个盒子,剩余
n
−
1
n-1
n−1个盒子中的物品数都一样。
数据范围:
2
≤
n
≤
1
0
5
,
0
≤
a
i
≤
1
0
9
2\leq n\leq 10^5, 0\leq a_i\leq 10^9
2≤n≤105,0≤ai≤109
题解:
考虑选择第
i
i
i个盒子,剩下
n
−
1
n-1
n−1个盒子中物品最多的盒子为
j
j
j,分完第
i
i
i个盒子后每个盒子物品数量为
a
v
e
ave
ave,那么必然有
a
v
e
≥
a
[
j
]
ave\geq a[j]
ave≥a[j]。
故记录下前缀
m
a
x
max
max和后缀
m
a
x
max
max,然后遍历每个盒子即可。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
int a[N], n;
int pre[N], suf[N];
ll sum, res;
void solve() {
scanf("%d", &n), sum = 0, res = 0;
for(int i = 1; i <= n; ++i) scanf("%d", &a[i]), sum += a[i];
if(sum % (n - 1)) res = n - 1 - sum % (n - 1);
pre[0] = suf[n + 1] = 0;
for(int i = 1; i <= n; ++i) pre[i] = max(pre[i - 1], a[i]);
for(int i = n; i >= 1; --i) suf[i] = max(suf[i + 1], a[i]);
for(int i = 1; i <= n; ++i) {
ll mx = max(pre[i - 1], suf[i + 1]);
ll ave = (res + sum) / (n - 1);
if(ave < mx) res += (mx - ave) * (n - 1);
}
printf("%lld\n", res);
}
int main()
{
int T = 1;
scanf("%d", &T);
for(int i = 1; i <= T; ++i) solve();
return 0;
}