1. 程式人生 > 實用技巧 >Educational Codeforces Round 98 (Rated for Div. 2) B

Educational Codeforces Round 98 (Rated for Div. 2) B

Educational Codeforces Round 98 (Rated for Div. 2) B

大意

給定 \(n\) 個數,現在需要增加某一些數的值,以滿足如下條件:

任意拿出一個數,將它的值分給另外 \(n-1\) 個數,至少存在一種分法,讓剩下的 \(n-1\) 個數相等。

問:

最少需要增加的值是多少?

思路

40min AC ...

\(X\)\(n\) 個數中的最大值, \(sum\)\(n\) 個數的和。

首先,拿出數並分掉並不會改變 \(sum\) 的值,那麼最終結果下 \((n-1)\mid sum\)

其次,因為 \(X\) 的存在,在不取出 \(X\)

的情況下, \(X*(n-1)\mid sum\) ,因為此時最優情況一定是所有數正好與 \(X\) 相等。

當滿足 \(sum=k*X*(n-1)\) 時,記取出任意數後剩下數中的最大值為 \(Y\) ,顯然,此時我可以讓剩下 \(n-1\) 個數的值與 \(X\) 相等。

又因為 \(Y\leq X\) ,所以 \(sum=k*X*(n-1)\) 的最小值即為最優解。

通過上述討論,不難發現,在不影響 \(n\) 個數中最大值的情況下,答案與放置位置無關。

而一定存在一種放置情況,不會影響最大值。

所以...

程式碼

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;

#define ll long long
#define ull unsigned long long
#define cint const int&
#define Pi acos(-1)

const int mod = 998244353;
const int inf_int = 0x7fffffff;
const ll inf_ll = 0x7fffffffffffffff;
const double ept = 1e-9;

int t;
ll n;
ll a[100100];

ll gcd(cint x, cint y) {
    return y==0? x: gcd(y, x%y);
}

int main() {
    cin >> t;
    while(t--) {
        ll mx=0;
        ll sum=0;
        cin >> n;
        for(int i=1; i<=n; i++) {
            cin >> a[i];
            sum += a[i];
            mx = max(mx, a[i]);
        }
        if(sum <= mx*(n-1)) cout << mx*(n-1)-sum << endl;
        else if(!(sum%(n-1))) cout << 0 << endl;
        else cout << (n-1) - (sum%(n-1)) << endl;
    }
    return 0;
}