算法练习——李白打酒
2016-02-03 19:21
288 查看
题目描述:
李白好饮酒,无事街上走;
提壶去打酒,
原有酒两斗;
遇店加一倍,
遇花喝一斗。
问:李白在遇到五家店和十朵花以后,他壶中的酒恰好喝完,那么他遇到花和店的顺序是怎样的?
题目解析:
这道题没有什么难度,但是前提是你做过这种类似的,就很好想了。解法就是使用二进制表示他遇到的花和店,那么遇到的顺序就有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; } } } } }
相关文章推荐
- 第十二天
- Wireshark抓包
- 一周复习总结(一)第二周
- 为没有web选项的eclipse添加web and JavaEE插件
- android 改变全局字体样式(第三方字体包)
- HDU1102并查集和最小生成树
- POJ 3641 -- 快速幂运算,素数判定
- 137 php 正则表达式2-反向引用
- 安卓自己定义日历控件
- Javascript自学-1
- 纪念蒟蒻博客第一天
- 设置tomcat的默认jdk
- 一些OJ网站
- hadoop、spark/storm等大数据相关视频资料汇总下载
- ENode框架单台机器在处理Command时的设计思路
- 【CODEVS3995】最长严格上升子序列(加强版)
- 随机森林vsGBDT
- BestCoder Round #70
- 编译器实践三 之 针对算术表达式的语法分析器
- LeetCode Problem:Odd Even Linked List