算法 11.纸牌游戏
2021/9/5 11:06:25
本文主要是介绍算法 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; }
这篇关于算法 11.纸牌游戏的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-11有哪些好用的家政团队管理工具?
- 2025-01-11营销人必看的GTM五个指标
- 2025-01-11办公软件在直播电商前期筹划中的应用与推荐
- 2025-01-11提升组织效率:上级管理者如何优化跨部门任务分配
- 2025-01-11酒店精细化运营背后的协同工具支持
- 2025-01-11跨境电商选品全攻略:工具使用、市场数据与选品策略
- 2025-01-11数据驱动酒店管理:在线工具的核心价值解析
- 2025-01-11cursor试用出现:Too many free trial accounts used on this machine 的解决方法
- 2025-01-11百万架构师第十四课:源码分析:Spring 源码分析:深入分析IOC那些鲜为人知的细节|JavaGuide
- 2025-01-11不得不了解的高效AI办公工具API