2 solutions

  • 1
    @ 2026-4-15 17:21:42

    等我账号的小CS没FM

    • -2
      @ 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
      7
      Tags
      # Submissions
      58
      Accepted
      13
      Uploaded By