1 solutions
-
0
Guest MOD
-
0
很容易可以证明,我们可以在这次操作内把数组内所有元素变成不超过的任意数。
所以我们需要考虑的是,如何将(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