题目链接:https://vjudge.net/contest/396219#problem/C
题解:判断一个数列通过加2的k次方变为非递减数列的最小操作数。多个项加减1次2的k次方算一次操作。一个项加减多个2的k次项算多次。
这个地方只需要统计输入的最大值,与其后面的值的最大差值。最后计算可以经过多少次可以弥补这个差值。最后答案即为次数
代码:
#include<iostream>
#include<string>
#include<algorithm>
#define maxn 100100
#define INF 1000000000
typedef long long ll;
ll a[maxn];
using namespace std;
int main()
{
int ans;
int n,t;
cin>>t;
while(t--)
{
ans=0;
cin>>n;
ll maxx=-INF;//储存最大值
ll t;//临时变量
ll cha=0;
for(int i=1;i<=n;i++)
{
cin>>t;
maxx=max(maxx,t);
cha=max(cha,maxx-t);
}
while(cha)
{
cha/=2;
ans++;
}
cout<<ans<<endl;
}
return 0;
}