題意:在一次操作中,她可以選擇手中的一張牌,然後玩它——把它放在這堆牌的底部,然後從這堆牌中抽出上面的牌。問最後牌低順序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;
}