没啥好说的,可能需要看着注释仔细想想
#include <stdio.h>//这是第十一题 卡牌游戏
long int hand_card[200002],deck[200002],position[200002]={};//首先我们创立三个新的数组,分别用来存储手牌,牌堆,以及记录每张牌的位置的数组
int main()
{
long int n;
int m=1;
scanf("%ld",&n);
long int p=0;
for(long int i=1;i<=n;i++)//首先,我们判断1是不是在手牌中
{
scanf("%ld",&hand_card[i]);
position[hand_card[i]]=0;//如果这张牌在手牌中,我们就把这张牌对应的位置设置为0
if(hand_card[i]==1)
{
m=0;
}
}
for(long int i=1;i<=n;i++)//接下来,我们判断1是不是在牌堆之中,如果在,记录1在牌堆中的位置
{
scanf("%ld",&deck[i]);
position[deck[i]]=i;
if(deck[i]==1)
{
p=i;
}
}
//printf("%ld\n",p);//检查是否成功查找1的位置
long int p1;
if(m==1)//接下来,做一个特殊情况的判断,看看排队的结尾是不是1234...这种情况一
{
for(p1=p;p1<=n;p1++)
{
if(deck[p1]!=(p1-p+1))
{
m=0;break;
}
}
}
//printf("%d\n",m);
if(m==1)//继续判断特殊情况,看看能不能在情况一的情况下继续特殊为情况一点一,这张情况下我们可以不停的抽一张放一张,直到结束
{
long int p2;
long int p3;
p2=n-p+2;
p3=n-p+1;
for(long int i=p2;i<=n;i++)
{
if((position[i])>=(i-p3))
{
m=0;
break;
}
}
}
//printf("%d\n",m);
//printf("%ld\n",p);
if(m==1)//如果是情况一点一,我们只需要抽n-p次就可以了
{
printf("%ld\n",p-1);
}
long int max=0,now;
if(m==0)//接下来我们来分析普通的情况
{
for(long int i=1;i<=n;i++)//首先,在这种情况之中,我们需要先把1抽到手,才可以进行后续的操作。
{
position[i]=position[i]-p;
}
for(long int i=1;i<=n;i++)
{
now=position[i]-i+1;//接下来,我们再看剩下的每张牌,按照每张牌的大小决定需要多少次才可以抽到他,之后打出
if(now>max)
{
max=now;
}
}
printf("%ld\n",max+n+p);
}
return 0;
}