题意:在一次操作中,她可以选择手中的一张牌,然后玩它——把它放在这堆牌的底部,然后从这堆牌中抽出上面的牌。问最后牌低顺序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;
}