李白打酒-----第五届蓝桥杯

通过编程求解李白在饮酒过程中遇到店和花的不同组合方式,确保最终酒壶为空且符合特定条件。利用二进制和循环遍历的方法进行计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

话说大诗人李白,一生好饮。幸好他从不开车。

    一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:

    无事街上走,提壶去打酒。

    逢店加一倍,遇花喝一斗。

    这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。 

    请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。


public class 李白打酒 {
	public static void main(String[] args) {
		long start = System.currentTimeMillis();
		int sum = 1 << 15;
		int jiu = 2;
		int a, b;
		int count = 0;
		char c[] = new char[15];
		// 设0表示a,1表示b
		for (int i = 1; i < sum; i++) {
			a = 0;
			b = 0;
			jiu = 2;
			for (int j = 0; j <= 14; j++) {
				// 最后一次一定遇到的花
				if (((i >> 14) & 1) == 0)
					break;
				int temp = (i >> j) & 1;

				if (temp == 0) {
					if (a >= 5)// 路过的次数有着严格的限制
						break;
					jiu = jiu * 2;
					a++;
					c[j] = 'a';
				} else if (temp == 1) {
					if (b >= 10)
						break;
					jiu--;
					b++;
					c[j] = 'b';
				}
				if (jiu < 0)// 酒的数量是不可能是负数的
					break;
			}
			if (jiu == 0 && a == 5 && b == 10) {
				count++;
				print(new String(c));
			}
		}
		print("可能的方案有:" + count + "种");
		long end = System.currentTimeMillis();
		print("此程序运行,花费的时间是" + ((end - start) / 1000.0) + "秒.");
	}

	public static void print(Object o) {
		System.out.println(o.toString());
	}
}



结果:

ababbbbbabababb
abbabbabbbababb
baababbbbbababb
abbabbbaabbbabb
abbbaabbabbbabb
baabbabbabbbabb
babaababbbbbabb
abbabbbabaabbbb
abbbaabbbaabbbb
baabbabbbaabbbb
abbbabaabbabbbb
baabbbaabbabbbb
babaabbabbabbbb
bababaababbbbbb
可能的方案有:14种
此程序运行,花费的时间是0.009秒.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值