您的位置:首页 > 其它

第五届蓝桥杯—李白打酒

2015-04-07 09:14 225 查看


标题:李白打酒

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

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

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

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

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

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

    注意:通过浏览器提交答案。答案是个整数。不要书写任何多余的内容。

第一种解法:全排列

//使用全排列做的,这个做法简单明了,穷举的方法,很多题都可以这样来做

#include<cstdio>

#include<iostream>

#include<algorithm>

#include<string.h>

#include<cstring>

using namespace std;

int main()

{

 int s=2,count=0;

 int x,y;

 int A[15];

 for(int a=0;a<=1;a++) 

 for(int b=0;b<=1;b++)

 for(int c=0;c<=1;c++)

 for(int d=0;d<=1;d++)

 for(int e=0;e<=1;e++)

     for(int f=0;f<=1;f++)

 for(int g=0;g<=1;g++)

 for(int h=0;h<=1;h++)

     for(int i=0;i<=1;i++)

 for(int j=0;j<=1;j++)

 for(int k=0;k<=1;k++)

     for(int l=0;l<=1;l++)

 for(int m=0;m<=1;m++)

 for(int n=0;n<=1;n++){

  x=0;

  A[0]=a;A[1]=b;A[2]=c;A[3]=d;A[4]=e;A[5]=f;A[6]=g;A[7]=h;A[8]=i;A[9]=j;A[10]=k;A[11]=l;A[12]=m; A[13]=n;

  for(int q=0;q<14;q++){

   if(A[q]==0){

    x++;

    if(x>5){s=2;break;}

    s *=2;

   }

   else s -=1;

     }

  if(s==1 && x==5)count++;

  s=2;

 }

 printf("%d\n",count);                

 return 0;

}

第二种解法:递归

好好想想,这种题型适合递归

#include<cstdio>

#include<iostream>

#include<algorithm>

using namespace std;

int c;

int f(int a,int b, int s)

{

 if(a>0)f(a-1,b,s*2);

 if(b>0)f(a,b-1,s-1);

 if(a==0 && b==0 && s==1)c=c+1;

 return c;

}

int main()

{

 c=0;

 printf("%d\n",f(5,9,2)); 

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: