zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    [BZOJ4553][TJOI2016&HEOI2016]序列
    树套树乱讲的代码
    树套树乱讲
    [Luogu4174][NOI2006]最大获益
    [BZOJ3879]SvT
    [BZOJ3611][HEOI2014]大工程
    [BZOJ1501][NOI2005]智慧珠游戏
    [BZOJ1499][NOI2005]瑰丽华尔兹
    [BZOJ3460] Jc的宿舍
    [HDU4812]D Tree
  • 原文地址:https://www.cnblogs.com/yvzhu/p/14010007.html
Copyright © 2011-2022 走看看