Codeforces 1339C-パワード追加


明らかに単純な質問ですが、mxの初期値が負の無限大に設定されていないため、0を直接書き込むのに1時間かかり、次のように書く時間はありません。


タイトル

1339C




タイトル

長さ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;
}

おすすめ

転載: www.cnblogs.com/stelayuri/p/12689098.html