B. Toy Blocks
题目链接:https://codeforces.com/contest/1452/problem/B
max 是数组最大值,sum是数组总和,n是数组长度
考虑当我们加入y个,使得数组满足题意。那么,我们如何使得y最小呢。当我们任取一元素x,分配给其它元素后,其它元素应当都是(max + k),(k >= 0)。可以看出 y与k成正比,我们只需要使得k最小,就可以得到y的最小值。
target:(sum + y - x) + x == (n - 1) ( max + k)
,其中k>=0
因此添加y个block后,只会反映到sum的改变。
-
当
sum == (n - 1) *max
。即可证,不需要再添加block -
当
sum < (n - 1) * max
时,k 明显为0。只需要添加(n - 1) * max - sum
的block即可使得上式相等。 -
当
sum > (n - 1) * max
时。这时k的作用就体现了。k尽可能取小的情况,使得上式相等。而我们最终添加block只会在sum中体现。不妨设为y 个block。令y + sum == (n - 1) (max + k)
。即
$$
k = \frac{y + sum}{n - 1} - max
$$
可以看出y 与 k成正比。如果y可以最小,那么k就可以取最小值。可以知道应当使得
(y + sum ) % (n - 1) == 0
。即y = (n - 1) - sum % (n - 1)
参考代码
#include <bits/stdc++.h>
using namespace std;
int t,n;
int temp;
long long sum;
void solve(){
cin >> t;
while(t-- > 0){
cin >> n;
long long max = -1;
sum = 0;
for(int i = 0;i < n;i++){
cin >> temp;
if(max < temp){
max = temp;
}
sum += temp;
}
if(sum >= max * (n - 1)){
if(sum % ( n - 1) == 0){
cout << "0\n";
}else{
cout << n - 1 - sum % (n - 1) << endl;
}
}else{
cout << (n - 1) * max - sum<<endl;
}
}
}
int main(){
solve();
return 0;
}