Educational Codeforces Round 98 (Rated for Div. 2) B
阿新 • • 發佈:2020-11-20
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\)
當滿足 \(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; }