题意
给定n
个盒子a
,
a
i
a_i
ai表示第i
个盒子中积木的数量。
可以将一些额外的积木放置到n
个盒子中,使得下面的操作成立,将需要的额外的积木的最小值输出。
- 任意选中一个
i
,将 a i a_i ai中的所有积木放到其他n-1
个盒子中,存在一种方案能够使n-1
个盒子中的积木数量相等。
题解
考虑两种情况
- 一般的情况,保证 s u m m o d ( n − 1 ) = 0 sum\ mod \ (n-1) =0 sum mod (n−1)=0以保证总量能够被除尽
k = ⌈ s u m n − 1 ⌉ k=⌈\frac{sum}{n-1}⌉ k=⌈n−1sum⌉
- 当选择的不是最大数量的盒子时,要保证所有的 n − 1 n-1 n−1个格子里的数量等于 m a x max max
k = m a x k=max k=max
综合以上两种情况
k
=
m
a
x
(
m
a
x
N
u
m
,
⌈
s
u
m
n
−
1
⌉
)
k=max(maxNum,⌈\frac{sum}{n-1}⌉)
k=max(maxNum,⌈n−1sum⌉)
Code
#include <bits/stdc++.h>
using namespace std;
int main() {
int t;
cin >> t;
while (t--) {
int n, maxNum = 0;
long long sum = 0;
cin >> n;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
maxNum = max(maxNum, x);
sum += x;
}
int k = (sum + n - 2) / (n - 1); //向上取整技巧
int res = max(maxNum, k);
cout << 1LL * res * (n - 1) - sum << endl;
}
return 0;
}