很简单的一道题,只要对题目理解到位就可以做出来
题目描述
话说大诗人李白,一生好饮。
一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:
无事街上走,提壶去打酒。 逢店加一倍,遇花喝一斗。
这一路上,他一共遇到店5次,遇到花 10次,已知最后一次遇到的是花,他正好把酒喝光了。
请你计算李白遇到店和花的次序,可以把遇店记为 aa,遇花记为 bb 。则:babaabbabbabbbbbabaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。
思路
粗看的话是10个0和5个1进行排列组合,这样大概有10万种,太大了影响运行时间。
用二进制数的形式代表排列组合的种类,比如题解中的010110010010000。
我们可以从一个比较接近答案的地方开始,比如010101010100000,再到一个接近答案的地方结束,比如11111000000000。
通过for循环不断改变排序,并转成string类型,用count判断是否为5个1,否就continue,是则用转为数组,并在数组前加上适当的0,最后遍历数组,观察是否满足条件
A=[]
num=2
nums=0
for i in range(8207,31745):
b=bin(i)
s=str(b)
if s.count("1")!=5:
continue
s=s.replace("0b","",1)
A.clear()
A=["0"]*(15-len(s))
for j in range(len(s)):
A.append(s[j])
num=2
for x in range(len(A)):
if A[x]=="0":
num-=1
if num<0:
break
if num==0:
if x==len(A)-1:
nums+=1
else:
break
elif A[x]=="1":
num*=2
print(nums)