没啥好说的,可能需要看着注释仔细想想
#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; }