LQ0190 李白打酒填空题

Posted 海岛Blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LQ0190 李白打酒填空题相关的知识,希望对你有一定的参考价值。

题目来源:蓝桥杯2014初赛 C++ B组C题

题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

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

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

无事街上走,提壶去打酒。 逢店加一倍,遇花喝一斗。

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

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

问题分析
一种方法是用DFS来实现。
另外一种方法是用二进制编码枚举,从低位到高位表示过程,1表示花,0表示店,再进行统计判定。

AC的C语言程序(DFS)如下:

/* LQ0190 李白打酒 */

#include <stdio.h>

int dfs(int s, int f, int n)

    if (s > 5 || f > 10 || n < 0)
        return 0;
    else if (s == 5 && f == 10 - 1 && n == 1)
        return 1;
    else
        return dfs(s + 1, f, n * 2) + dfs(s, f + 1, n - 1);


int main()

    printf("%d\\n", dfs(0, 0, 2));
    return 0;

AC的C语言程序(二进制位枚举)如下:

/* LQ0190 李白打酒 */

#include <stdio.h>

#define N 15

int main()

    int start = 1 << (N - 1);
    int end = (start << 1) - 1;

    int cnt = 0;
    for (int i = start; i <= end; i++) 
        int s = 0, f = 0, al = 2;
        for (int j = 0; j < N - 1; j++) 
            if ((i >> j) & 1) 
                if (++f > 10) break;
                al--;
             else 
                if (++s > 5) break;
                al *= 2;
            
        
        if (f == (10 - 1) && s == 5 && al == 1)
            cnt++;
    

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

    return 0;

以上是关于LQ0190 李白打酒填空题的主要内容,如果未能解决你的问题,请参考以下文章

李白打酒

(二进制枚举或dfs)李白打酒

李白打酒

李白打酒

状态压缩

2014_B t3李白打酒