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
";
            }else{
                cout << n - 1 - sum % (n - 1) << endl;
            }
        }else{
            cout << (n - 1) * max - sum<<endl;
        }
    }
}

int main(){
    solve();
    return 0;
}
原文地址:https://www.cnblogs.com/yvzhu/p/14010007.html