算法练习——李白打酒

来源:互联网 发布:网络文学社介绍 编辑:程序博客网 时间: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
原创粉丝点击