算法 11.纸牌游戏

没啥好说的,可能需要看着注释仔细想想

 #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;
} 
 


上一篇:ldconfig 命令


下一篇:C语言递归函数 计算s=1²+2²+3²+…+n²的值