本文共 1549 字,大约阅读时间需要 5 分钟。
为了解决这个问题,我们需要找到最小的额外木块数,使得无论选择哪一个盒子进行操作,剩下的n-1个盒子的木块数量都相等。
我们可以通过以下步骤来解决这个问题:
cnt = max(ceil(sum / (n-1)), MAX) * (n-1) - sum
,其中 ceil(sum / (n-1))
是将总数sum分配到n-1个盒子中的最小平均值,而MAX则是当前的最大值,确保分配后的数量至少不小于最大值。我们可以通过二分枚举的方法来解决这个问题:
mid * (n-1) >= sum
。mid * (n-1) - sum
。#include#include #include using namespace std;int main() { const int INF = 1e9; int T; scanf("%d", &T); while (T--) { int n; scanf("%d", &n); vector a(n); ll sum = 0; for (int i = 0; i < n; ++i) { ll x; scanf("%lld", &x); sum += x; } ll MAX = *max_element(a.begin(), a.end()); // 方法一 ll cnt = (sum + n - 2) / (n - 1); cnt = max(cnt, MAX) * (n - 1) - sum; cout << cnt << endl; // 方法二 ll l = MAX; ll r = 2 * INF; ll ans = l; while (l <= r) { ll mid = (l + r) >> 1; if (mid * (n - 1) >= sum) { ans = mid; r = mid - 1; } else { l = mid + 1; } } cout << (ans * (n - 1)) - sum << endl; }}
这两种方法各具特色,适用于不同的场景,但都能有效解决问题。
转载地址:http://tffmz.baihongyu.com/