Educational Codeforces Round 98 (Rated for Div. 2)
B. Toy Blocks
还是说一下题意吧
一个数组,允许你为任意一位添加任意值,
要求达到的效果是,对于该数组内任意一个值,把这个值分给数组内其他的值,使得该位为0并且除它以外的所有值都相同,
对于任意一个数组内的数字都满足上面的要求,问你添加的值的最小值
目标状态是一个最大值,剩下的值都相等,我们把最大值设为max,剩下的值设为min
要满足以下条件
min / (n-2) = max - min && max % (n-1) == 0
如果拿出min,那么min能弥补剩下的min和max之间的差距
如果拿出max, 那么max补min后得让所有的min都相等
比赛的时候到这步就结束了,并没有化简上式
化简上式
(n - 1) * min = (n - 2) * max && max % (n-1) == 0
那么就代表着如果是拿出min的话,剩下的值就都是max了(比赛时没想到)
这道题就写完了
#include <cstdio>
typedef long long ll;
const int N = 100100;
int n;
int a[N];
int main(){
int T;
scanf("%d", &T);
while(T--){
scanf("%d", &n);
ll sum = 0;
int maxn = 0;
for(int i = 1 ;i <= n ;i++){
scanf("%d", &a[i]);
sum += a[i];
if(a[i] > maxn){
maxn = a[i];
}
}
if(1ll * maxn * (n - 1) - sum >= 0)
printf("%lld\n", 1ll*maxn*(n-1)-sum);
else{
if(sum % (n - 1) == 0)
puts("0");
else
printf("%lld\n", sum / (n - 1) * (n - 1) + (n - 1) - sum);
}
}
return 0;
}
E. Two Editorials