1338A.Powered Addition(思维)

忽略了二进制的性质,就是2的幂次可以组合成任何数,所以对每个数可以先贪心的计算出使得这个数比前一个数大的步数,再釜底抽薪把前面的多余的步去掉。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+100;
ll a[maxn];
ll cal (ll a,ll b) {
    ll ans=1;
    ll num=a;
    while (b) {
        if (b&1) ans=ans*num;
        num=(num*num);
        b>>=1;
    }
    return ans;
}
int main () {
    int T;
    scanf("%d",&T);
    while (T--) {
        int N;
        scanf("%d",&N);
        ll Max=0;
        for (int i=1;i<=N;i++) scanf("%lld",&a[i]);
        for (int i=2;i<=N;i++) {
            if (a[i]>=a[i-1])
                continue;
            ll x=1;
            while (cal(2,x)-1<a[i-1]-a[i]) {
                x++;
            }
            a[i]+=cal(2,x)-1;
            a[i]=a[i-1];
            Max=max(Max,x);
        }
        printf("%lld\n",Max);
    }
}

猜你喜欢

转载自www.cnblogs.com/zhanglichen/p/12690625.html