Codeforces Round #564 (Div. 2) C. Nauuo and Cards 思維

傳送門

題意:在一次操作中,她可以選擇手中的一張牌,然後玩它——把它放在這堆牌的底部,然後從這堆牌中抽出上面的牌。問最後牌低順序1-n的最少操作。

思路:經過簡單的手推可以發現 如果一個牌在應該b中的位置是i,那麼它在i-1的位置時候 需要移動n次才能達到i。

即 ans=max(ans,per[i]-(i-1)+n) 這是最壞的情況 也就是先把所有牌都放在手上 然後依次插入

還有一種情況可以節省操作此時 那就是 以1,2,3,...,k結尾的 並且k~n的數 都可出現在手裏 這樣就不必取出了,答案就是n-i。

 

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    const int maxn=2e5+10;
    int a[maxn];
    int b[maxn];
    int per[maxn];
    int main()
    {
        memset(per,0,sizeof(per));
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
        }
        for(int i=1;i<=n;i++)
        {
            cin>>b[i];
            per[b[i]]=i;
        }
        if(per[1])
        {
            int cnt=1;
            int id=per[1];
            for(int i=per[1];i<=n;i++)
            {
                if(per[cnt]==i)
                {
                    cnt++;
                    id=i;
                }
                else
                    break;
            }
            if(id==n)
            {
                for(int i=0;i<=n;i++)
                {
                    if(per[cnt]<=i)
                        cnt++;
                    else
                        break;
                }
                if(cnt>n)
                {
                    cout<<per[1]-1<<endl;
                    return 0;
                }
            }
        }
        int ans=0;
        for(int i=1;i<=n;i++)
        {
            ans=max(ans,per[i]-(i-1)+n);
        }
        cout<<ans<<endl;
        return 0;
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章