蓝桥杯 2014本科C++ B组 李白打酒 三种实现方法 枚举/递归
标题:李白打酒
话说大诗人李白,一生好饮。幸好他从不开车。
一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:
无事街上走,提壶去打酒。
逢店加一倍,遇花喝一斗。
这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。
请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。
注意:通过浏览器提交答案。答案是个整数。不要书写任何多余的内容。
答案:14
先提供两种用枚举方式来解决此问题的方法,前面14个格子要摆放的是0,1(用0标识花,1标识店)
方案一,用0,1把前14个格子按照字典序打印出来,但要保证其0,1的总数小于规定总数。然后模拟这个过程。
代码:
1 /*方法1*/#include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define MAXN 20 5 using namespace std; 6 int num[MAXN],s=0;//花记为 0,店记为 1 7 void dfs(int cur) 8 { 9 int n0=0,n1=0,i,j,c=2; 10 bool flag=true; 11 if(cur==15) 12 { 13 for(i=1;i<=14;i++) 14 { 15 c=num[i]==0?c-1:c*2; 16 if(c==0) 17 { 18 flag=false; 19 break; 20 } 21 } 22 if(flag==false) 23 return ; 24 else 25 { 26 if(c==1) 27 { 28 s++; 29 for(i=1;i<=14;i++) 30 cout<<num[i]<<' '; 31 cout<<0<<endl; 32 } 33 return ; 34 } 35 } 36 for(i=0;i<=1;i++) 37 { 38 if(i==0) 39 { 40 for(j=1;j<=cur-1;j++) 41 { 42 if(num[j]==0) 43 n0++; 44 } 45 if(n0<9) 46 { 47 num[cur]=0; 48 dfs(cur+1); 49 num[cur]=-1; 50 } 51 } 52 else 53 { 54 for(j=1;j<=cur-1;j++) 55 { 56 if(num[j]==1) 57 n1++; 58 } 59 if(n1<5) 60 { 61 num[cur]=1; 62 dfs(cur+1); 63 num[cur]=-1; 64 } 65 66 } 67 } 68 } 69 int main() 70 { 71 memset(num,-1,sizeof(num)); 72 dfs(1); 73 cout<<s<<endl; 74 return 0; 75 }
View Code
方案二,我们其实只要将5个1填入前14个格子里,其实是 种方案,我们依旧可以用枚举的方式实现,依次去按字典序排列5个数(但必须是按递增的序列排列)选取的数字是从1-14里选择。
代码:
1 /*方法2*/ 2 #include<iostream> 3 #include<cstdio> 4 #include<cstring> 5 #define MAXN 20 6 using namespace std; 7 int num[MAXN],ans[MAXN],s=0;//花记为 0,店记为 1 8 void dfs(int cur,int k) 9 { 10 int ok,c=2,i,j; 11 bool flag=true; 12 if(cur==6) 13 { 14 memset(num,0,sizeof(num)); 15 for(i=1;i<=5;i++) 16 { 17 num[ans[i]]=1; 18 } 19 for(i=1;i<=14;i++) 20 { 21 c=num[i]==0?c-1:c*2; 22 if(c==0) 23 { 24 flag=false; 25 break; 26 } 27 } 28 if(flag==false) 29 return ; 30 else 31 { 32 if(c==1) 33 { 34 s++; 35 for(i=1;i<=14;i++) 36 cout<<num[i]<<' '; 37 cout<<0<<endl; 38 } 39 return ; 40 } 41 } 42 for(i=k+1;i<=14;i++) 43 { 44 ok=1; 45 for(j=1;j<=cur-1;j++) 46 { 47 if(ans[j]==i) 48 ok=0; 49 } 50 if(ok) 51 { 52 ans[cur]=i; 53 dfs(cur+1,i); 54 } 55 } 56 } 57 int main() 58 { 59 memset(ans,0,sizeof(ans)); 60 dfs(1,0); 61 cout<<s<<endl; 62 return 0; 63 }
View Code
而递归的方式实现将变得更加简洁。
由于实现此过程的总数等于开头为a和开头为b的总和,再递归这两个决策,直到a==0&&b==0&&c==1结束。
代码:
1 /*递归*/ 2 #include<iostream> 3 using namespace std; 4 int sum=0; 5 int f(int a,int b,int c){ // a:店的总数 b:花的总数减1 c:酒的初值 6 // 任何初始状况,都有两个可能:先遇到店,或者先遇到花 7 if(a>0) 8 f(a-1,b,c*2); // 逢店加一倍 9 if(b>0) 10 f(a,b-1,c-1); // 遇花喝一斗 11 if(a==0&&b==0&&c==1) //这个是满足要求的终止条件。没有店剩下,还剩一朵花和一斗酒 12 sum=sum+1; 13 return sum; 14 } 15 int main() 16 { 17 f(5,9,2); 18 cout<<sum<<endl; 19 return 0; 20 }
View Code
转载于:https://www.cnblogs.com/fancy-itlife/p/4299846.html
蓝桥杯 2014本科C++ B组 李白打酒 三种实现方法 枚举/递归相关推荐
- 青少年蓝桥杯_2020_steam考试_中级组_第三题
编程实现 小蓝的学校组织了一场演讲比赛,有 8 位评委对参赛选手进行打分.打分规则是去掉 8 位评委中最 高分和最低分后,计算出剩余 6 位评委分数的平均值(保留两位小数)作为最后得分. 小蓝同学也积 ...
- 青少年蓝桥杯_2020_steam考试_初级组_第三题
编程实现 有 n 个人围成一个圈,按顺序排好号.然后从第一个人开始报数(从 1 到 3 报数),报到 3 的人退 出圈子,然后继续从 1 到 3 报数,直到最后留下一个人游戏结束,问最后留下的是原来第 ...
- 动态规划算法练习:蓝桥杯,洛谷的传纸条游戏的三种解法
目录 方法一 方法二 方法三 方法一 package extraExercise; /*算法训练 传纸条描述小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排 ...
- 【蓝桥杯Web】大一小白参与蓝桥杯模拟赛二期web组体会
目录 前言 一.相关比赛介绍 1.ACM国际大学生程序设计竞赛 2.蓝桥杯 3.GPLT团队程序设计天梯赛 4.leetcode周赛和双周赛 5.PAT 二.蓝桥杯 1.应该参加蓝桥杯吗? 2.如何进 ...
- [第四届蓝桥杯省赛C++B组]省赛全题目题解
文章目录 快速分支通道 1.高斯日记 来源: 第四届蓝桥杯省赛C++A/B组 算法标签 模拟 题目描述 输出格式 思路 CPP代码 2.马虎的算式 题目描述: 算法标签: 枚举 题目答案: 题目思路: ...
- 蓝桥杯历年省赛JAVA-B组真题汇总及题目详解
蓝桥杯 历年省赛JAVA-B组真题汇总及题目详解 题目大致介绍: 第一题到第三题以及第六题是结果填空,方法不限得到最后结果就行. 第四题和第五题是代码填空题,主要考察算法基本功和编程基本功. 第八题到 ...
- 蓝桥杯国赛C++A组B组题解整理(第八、七、六、五、四届)
[写在前面的话19.04.04] 今年省赛的结果出的意外得快,有很多小伙伴来和我分享他们进了省一的喜悦,并问我啥时候更新国赛题解,emmm--不是我不想更新,实在是抽不出时间,有缘再更--虽然不更新题 ...
- 2020年第十一届蓝桥杯 - 国赛 - Python大学组 - H.答疑
题目链接 Ideas 2020年第十一届蓝桥杯 - 国赛 - Python大学组 - H.答疑 Code Python if __name__ == '__main__':n = int(input( ...
- 2020年第十一届蓝桥杯 - 国赛 - Java研究生组 - F.循环小数
2020年第十一届蓝桥杯 - 国赛 - Java研究生组 - F.循环小数 在线评测 Ideas 对于一个纯循环小数,假设循环节为l,则小数为0.llll-,转换为分数就是 l / (10 ** n ...
最新文章
- hdu 1075 (字典树映射)
- 词向量之BERT 结构
- LiveVideoStackCon 专题评审团招募进行中
- 【转】云社区 博客 博客详情 二维异形件排版算法介绍(一)
- 漆桂林 | 人工智能的浪潮中,知识图谱何去何从?
- 2020年系统集成项目管理工程师上午真题及答案解析
- Dart 10-Day
- swagger中参数为数组dataType的设置
- js中字符串全部替换函数(正则表达式)
- 关闭多个activity
- AD7124-4调试经验分享
- quot 成为通用计算机器 quot,汉语拼音:从读写工具到文化津梁
- 二进制、十进制、八进制、十六进制 各代表的英文字母是什么
- move是MySQL命令_MOVE命令_视频讲解_用法示例-redis编程词典-php中文网
- 文件或目录结构损坏且无法读取快速恢复数据的方法
- 查看连接网络的WiFi密码
- 他一年开发19款!款款口碑爆棚
- Mac下安装Mysql 记录过程
- weston 配置文件去掉状态工具栏
- mpv播放器旋转视频
热门文章
- 语言压缩zip win_主流压缩软件挨个尝试后,我选择了没有短板的全能压缩Bandizip...
- sql int 比较_SQL进阶--错题集1
- java实现浏览器_利用Java实现网页浏览器
- python的框架django_Python框架Django高级内容,python
- 递归算法1加到100_「算法」北京大学算法基础—递归(1)
- php十年磨一剑,十年磨一剑
- python运用ico图标_如何优雅地处理Django中的favicon.ico图标详解
- Android Studio and Gradle are using different locations for the JDK
- 浅谈UWB室内定位(三)
- php配置mysql集群_【mysql集群】mysql集群配置