c++ - 李白喝酒问题的算法
PHPz
PHPz 2017-04-17 11:22:48
0
13
1931

“李白街上走,提壶去买酒,遇店加一倍,见花喝一斗”,途中,遇见5次店,见了10此花,壶中原有2斗酒,最后刚好喝完酒,要求最后遇见的是花,求可能的情况有多少种?希望大家分享一下思路,谢谢!
我的思路很混乱,觉得直接暴力枚举能解决,但是枚举所有的情况比较不现实,希望大家解答啊!

PHPz
PHPz

学习是最好的投资!

Antworte allen(13)
洪涛
"""
这是今年蓝桥杯java中的一道填空题,当时我还以为做对了,写了33
结果我忽略了最明显的判断条件,5次店和10次花,少了下面的 check1 函数
简直为自己的智商捉鸡,加了之后就是14了,
最近学python,现用python实现这题,跟大家分享
"""

count=0;
def check(t):
    sum = 2;
    for ch in t:
        if ch=='1':
            sum=sum*2;
        if ch=='0':
            sum=sum-1;
    return sum;
def check1(t):
    c = 0;
    for ch in t:
        if(ch=='1'):
            c+=1;
    if c==5:
        return True;
    return False;
def f(t):
    if(len(t)==15):
        if check(t)==0 and t[14:15]=='0' and check1(t):
            global count;
            count+=1;
            print(" ".join(t));
        return;
    f(t+'1');
    f(t+'0');
f('');
print(count);
巴扎黑

简单的给一个非递归的python代码:

queue = [(2, 5, 10)]
total = 0
def iter():
    global queue
    while queue:
        i, queue = queue[0], queue[1:]
        yield i

for (left, dian, hua) in iter():
    if dian == 0:
        total += 1 if left == hua else 0
    else:
        if left > hua or left == 0 or hua ==0:
            continue
        queue.append((left*2, dian-1, hua))
        queue.append((left-1, dian, hua-1))
大家讲道理

暴力穷举很好做,不再说了
最后一次是见花的话,2经过说明经过14次变换之后值是1,
10次见花之后是0的话,初始是2斗酒,说明一共加了8斗酒
加酒最小值是1,最大是4(11114),
因为加酒是加倍方法,数列中相邻两个数倍差不能大于2倍,即11114这类被排除,可能加酒的数字在1-3的范围内,同样因为倍差原因,1后面只能是2(但是3后面可是是1)
因为初期值是2,第一次加酒只可能是1或者2斗
于是找有几个满足条件的数列就行

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage