【AtCoder Regular Contest 079 E】Decrease (Judge ver.)

贪心。

题目大意:

给定 $n$ 个数,需要进行以下操作若干次:

  • 选择最大的数(如果有多个则任意选择),让它减去 $n$,让其他数加上 $1$。

问多少次操作后,最大值小于 $n$。

题解:

由于最大值要小于 $n$,所以如果最大值大于等于 $n$ 时,它必然会进行操作。而且对其他数加 $1$ 的操作,可以在这之后统一进行,不会对前面的操作产生影响。

所以我们不用管“选择最大的数”的条件,直接每次令所有数降到 $n$ 以下即可。这样做完以后再将要加上的数量加上去。如果此时最大值大于等于 $n$ 则继续。

这样最多 $O(\log a)$ 次一定会结束。

Code:

#include<cstdio>
typedef long long LL;
int n;
LL a[55],ans,s,b[55];
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;++i)scanf("%lld",a+i);
    for(;;s=0){
        for(int i=1;i<=n;++i)s+=b[i]=a[i]/n,a[i]%=n;
        if(!s)break;
        ans+=s;
        for(int i=1;i<=n;++i)a[i]+=s-b[i];
    }
    printf("%lld\n",ans);
    return 0;
}