明らかに単純な質問ですが、mxの初期値が負の無限大に設定されていないため、0を直接書き込むのに1時間かかり、次のように書く時間はありません。
タイトル
タイトル
長さnの配列が与えられた
k番目の秒では、配列の任意の要素に2 k-1を追加でき、それを選択するかどうかを選択できます。
この配列を減少しないシーケンスにするのに少なくとも何秒かかるか尋ねます
問題解決のアイデア
要素に追加できるのは正の値だけなので
したがって、特定の位置xを変更する必要があるという条件は、位置xの値より大きい1〜x-1の値があり、結果として減少することです。
次に、位置xの値を以前の最大値以上の数に変更する必要があります
この問題をバイナリの観点から見ると、
位置の数が以前の最大値と同じになるために少なくともdでなければならない場合
dをバイナリに変換した後、d の最上位ビットの桁数は、このステップを完了するために必要な合計時間です
低から高への0と1は、その秒で変更する必要があるかどうかを示します。
したがって、最適なソリューションは、すべての逆順ペアを見つけることであり、逆順ペアの最大差の桁数が答えです。
手順
#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
void solve()
{
int n,ans=0,ar,mx=-INF,mxd=0;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>ar;
mx=max(mx,ar);
mxd=max(mxd,mx-ar);
}
while(mxd)
{
mxd>>=1;
ans++;
}
cout<<ans<<'\n';
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int T;cin>>T;
for(int t=1;t<=T;t++)
solve();
return 0;
}