3541 - 李白打酒(14年蓝桥杯省赛第3题)

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

    一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:
    无事街上走,提壶去打酒。
    逢店加一倍,遇花喝一斗。
    这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。 
    请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb就是合理的次序。

    像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。

题目输入

题目输出

输入/输出样例

题目输入


                

题目输出


                

C语言解答

#include<stdio.h>
int n,b;
void fun(int a[15],int m,int h,int d)
{
	if(m < 14 && h < 9 && d < 5){
	a[m] = 1;
	fun(a,m +1,h+1,d);
	a[m] = 2;
	fun(a,m +1,h,d+1);
	}
	else
	{
		b = 2;
		if( h == 9)
		for(int i = m;i < 14; i++)
		a[i] = 2;
		else if(d == 5)
		for(int i = m;i < 14; i++)
		a[i] = 1;
		a[14] = 1;
		for(int i = 0;i < 14; i++){
			if(a[i] ==1)
			 b-= a[i];
			else
			b *= 2;
		}
		if(b == 1)
		n++;
}
}
int main()
{
	int a[15],m = 0;
	int h = 0,d = 0;
	fun(a,m,h,d);
	printf("%d",n);
	return 0;
}

C++解答

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int p[15]={1,1,1,1,1,2,2,2,2,2,2,2,2,2,2};//1是店,2是花 
	int sum,cnt=0;
	do
	{
		sum=2;
		for(int i=0;i<15;i++)
			if(p[i]==1)
				sum<<=1;
			else if(p[i]==2)
				sum--;
		if(sum==0) cnt++;
	}
	while(next_permutation(p,p+14));//因为最后一次遇到的肯定是花,所以只排前14个,不排最后一个数 
	cout<<cnt;
	return 0;
}
时间限制 1 秒
内存限制 128 MB
讨论 统计
上一题 下一题