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); } }