【C. Nauuo and Cards】
【题解】
题意:给定2*n张卡牌,其中有n张为空牌用0表示。给定一个n,再给定长度为n的你所拥有的牌的序列,再给定初始堆从上到下的n张牌的牌面。每次可执行一个操作:取一张牌放置于堆的底部,然后取走堆的顶部的那张牌。问:最少执行多少次此操作使得堆从上到下从1递增到n。
官方题解思路:
首先尝试不打空白牌能否直接完成,如果能就是最优解,否则最优解一定是先打若干空白牌然后从1打到n.
设p[i]为i在牌堆的初始位置(初始在手上则为0),那么答案为max(p[i]+1+n-i)(每张牌最早在第p[i]+1张被打出,还要打n−i张)。
【代码】
#include <bits/stdc++.h>
using namespace std;
const int maxn=200010;
int a[maxn],b[maxn],p[maxn];
int main()
{
int n,i,j; scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d",a+i);
p[a[i]]=0;
}
for(i=1;i<=n;i++){
scanf("%d",b+i);
p[b[i]]=i;
}
if(p[1])
{
for(i=2;p[i]==p[1]+i-1;i++);
if(p[i-1]==n){
for(j=i;j<=n&&p[j]<=j-i;j++);
if(j>n){
printf("%d\n",n-i+1);
return 0;
}
}
}
int ans=0;
for(i=1;i<=n;i++)
ans=max(ans,p[i]-i+1+n);
printf("%d\n",ans);
return 0;
}