题目Problem - B. Countless Me- Codeforces:
分析:
假设最优的情况下,每个值为 ,…,则使给定序列变为最优值只需要一次,整个序列只需要n次,所以可以把序列变成任意序列。因为越$ | $越大,所以不难想到拆位并尽可能让高位置。
我们不妨把所有值相加为,从第 开始高位往低位分析。设当前位为第位,如果 那么可以当前位置0,否则我们尽量把当前位填更多。(因为当前位置越多,后面越容易置,且因为当前位置,拆成后面一定为偶数个,在之后不能置的情况下,一定会往前进位,那么现在置不会更坏)
代码:
void solve(){
int n,res=0;
cin>>n;
for(int i=1;i<=n;i++){
int x;cin>>x;
res+=x;
}
int ans=0;
for(int i=30;i>=0;i--){
int ver=((1ll<<i)-1)*n;
if(res>ver)ans|=(1ll<<i),res-=min(n,res/(1ll<<i))*(1ll<<i);
}
cout<<ans<<"\n";
}