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 ...

记原来 \(n\) 个数之和为 \(sum\) ,增加的值为 \(dx\)\((sum+dx)\) 应该满足条件。

显然, \((n-1)\mid (sum+dx)\)

记 $K =\dfrac{sum+dx}{n-1} $ ,则 \(K\) 的含义就是相等时的值。

\(n\) 个数中最大值为 \(X\)

不难发现当且仅当 \(X \leq K\) 时,一定满足 \(n-1\) 个数相等的条件。

现在我们最小化 \(K\) 的值。

移项得 \((n-1)X-sum\leq dx\)

我们得到如下条件:

\(\begin{cases}(n-1)*X-sum\leq dx\\ (n-1)\mid (sum+dx)\end{cases}\)

\(sum \leq (n-1)*X\) 时, \(dx_{min}=(n-1)*X-sum\)

\((n-1)|sum\) 时, \(dx_{min}=0\)

否则 \(dx_{min}=(n-1)-(sum\%(n-1))\) ,此时 \((n-1)|(sum+dx_{min})\)

代码

#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;
}

我之前写的思路是什么鬼玩意...

posted @ 2020-11-20 14:42  ullio  阅读(126)  评论(0)    收藏  举报