算法练习——李白打酒
来源:互联网 发布:网络文学社介绍 编辑:程序博客网 时间:2024/05/18 03:24
题目描述:
李白好饮酒,
无事街上走;
提壶去打酒,
原有酒两斗;
遇店加一倍,
遇花喝一斗。
- 问:李白在遇到五家店和十朵花以后,他壶中的酒恰好喝完,那么他遇到花和店的顺序是怎样的?
- 题目解析:
- 这道题没有什么难度,但是前提是你做过这种类似的,就很好想了。解法就是使用二进制表示他遇到的花和店,那么遇到的顺序就有2的15次方种,穷举所有情况,使得条件为:①、只遇到5次店,十次花;②、最后一个遇到的只能是花③、酒的数量不会小于0并且在最后遇到花时喝完。
- 如此这般,代码就很好描述了,如下(Java描述):
public class Libaidajiu { public static void main(String[] args) { int count= 0;//计数 for (int i = 16384; i < 32768; ++i) {//共遇到15个花或者店 循环2的15次方次 但为保证最后一个遇到的是花,i从16384开始,使最高位为1,到时候输出的时候是倒过来的,即最后一个遇到花 int sum= 2;//酒的总数,开始时为2斗 int flower= 0;//遇见花的次数 int store= 0;//遇见店的次数 int k1= i;//k1,k2 为存储i 的变量 int k2= i; int j= 0; for (; j < 15; ++j) {//循环15次 确定每次遇到的是花还是店 if(k1%2==1){ flower++;//遇花喝一斗 sum-= 1; }else { store++;//遇店加一倍 sum*= 2; } if(sum<0) break;//酒数量不会<0 if(flower>10) break;//遇到5店10花 if(store>5) break; k1/= 2; } if(j==15 && sum==0){//当j= 15 说明符合以上j的for循环中的条件 //输出sum=0的 遇到花、店的顺序 System.out.println(); System.out.print(++count+"\t"); int t= j; while(t--!= 0 ){ if(k2%2==1) System.out.print("花 "); else System.out.print("店 "); k2/= 2; } } } }}
1 0
- 算法练习——李白打酒
- 李白打酒—蓝桥杯
- 李白打酒—题解
- 蓝桥杯——李白打酒
- 第五届蓝桥杯—李白打酒
- 蓝桥杯—李白打酒 dfs
- 算法 李白打酒问题
- 蓝桥杯——李白打酒(正式版)
- 0003 2014蓝桥-练习 李白打酒
- 蓝桥杯——真题训练之李白打酒
- YTU2507——李白打酒(蓝桥杯赛题)
- 蓝桥杯_C语言_本科B——李白打酒
- 蓝桥杯编程大题—— 李白打酒
- 2014年第五届蓝桥杯预赛部分题目—李白打酒
- 李白打酒
- 李白打酒
- 李白打酒
- 李白打酒
- POJ 3641 -- 快速幂运算,素数判定
- HDU1102并查集和最小生成树
- 算法训练 旅行家的预算
- 为没有web选项的eclipse添加web and JavaEE插件
- 树
- 算法练习——李白打酒
- JAVAH生成JNI头文件
- 【工作流】——如何创建流程图工作流
- Android基本架构
- cvEqualizeHist() 直方图均衡化(单通道)
- android 单元测试简单方法及错误处理
- SSH框架解析
- join()和split()方法
- ndk-build生成.so