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;
    }
    
  • 相关阅读:
    Oracle求连续的年份
    关于Extjs MVC模式上传文件的简单方式
    后进先出 stack、 先进先出Queue
    python的文件操作
    C#的接口
    C#的访问级别
    C#的继承
    SQL查询语句 常用示例
    SQL Server数据库常用函数
    数据库建立和连接
  • 原文地址:https://www.cnblogs.com/yvzhu/p/14010007.html
Copyright © 2011-2022 走看看