1 solutions

  • 0
    @ 2025-4-8 13:28:30

    很容易可以证明,我们可以在这nn次操作内把数组内所有元素变成不超过(s=i=1nai)(s = \sum_{i = 1}^{n} a_{i})的任意数。

    所以我们需要考虑的是,如何将(s)分配到(n)个位置上,使得(ans)最小。

    贪心的考虑,我们肯定是要让手里待分配的数字变小,使情况简化,所以从高位开始分配。

    从最高位开始贪心,如果不分配当前位数(i)的二进制值,转到(i - 1)位可以把(s)分配完的,就不进行分配(),否则就从(s)中分配出(x = min(n, \lfloor\frac{s}{2^{i}}\rfloor))个(2^{i}),只有(n)个位置,所以最多只能分配(n)个。

    #include <bits/stdc++.h>
    using namespace std;
    #define ll long long
    ll sum = 0;
    ll a[200005];
    int main()
    {
        int n;
        cin >> n;
        for (int i = 1; i <= n; i++)
        {
            cin >> a[i];
            sum += a[i];
        }
        ll ans = 0;
       	for(int i = 30 ; i >= 0 ; i--)
        {
            ll k = 1ll << i;
            if (n * 1ll * (k - 1) < sum)
            {
                ll x = min(n * 1ll, sum / k);
                ans += k;
                sum -= x * k;
            }
        }
        cout << ans << endl;
    }
    
    • 1

    Information

    ID
    1456
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    8
    Tags
    # Submissions
    55
    Accepted
    10
    Uploaded By