Example
input
3
3
3 2 2
4
2 2 3 2
3
0 3 0
output
1
0
3
解析:
对于某个盒子,我们用其余盒子的最大值 mx 乘以其余的盒子数量(n-1),再减去其余盒子当前的数量 ( sum-a[ i ] ),即为需要补上的数量 cnt
现在这个盒子中有 p 个
1. 如果 p<=cnt, 说明当前盒子的玩具全部分到别的盒子依然不够,所以要补上 cnt-p 个。
2. 如果 p>cnt ,说明当前盒子的玩具全部分到别的盒子还会多出一部分,这一部分必须平均分出去使得其余盒子都相同,所以先对于 n-1 取模,剩余的数量再补上 (n-1)- p个,即为所求。
全部取最大值即为答案。
cpp
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
ll t,n,a[N],f1,f2,sum;
int main(){
scanf("%lld",&t);
while(t--){
scanf("%lld",&n);
ll sum=0;
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
sum+=a[i]; //计算总和
}
ll res=0,mx;
sort(a+1,a+n+1); //排序
for(int i=1;i<=n;i++){
if(i==n) mx=a[n-1]; // mx为除了当前 i 之外的最大值
else mx=a[n];
ll cnt=(n-1)*mx-(sum-a[i]); //计算剩余需要补上的差
if(a[i]<=cnt) res=max(res,cnt-a[i]); //不够,则差即为要补上的值
else{
ll p=a[i]-cnt; //否则,取模并且计算差值
if(p%(n-1)!=0){
p%=(n-1);
res=max(res,n-1-p);
}
}
}
printf("%lld\n",res);
}
return 0;
}