解题思路:本题目给出了买糖总人数以及1元和2元的人数,这里提到店员没有零钱,因此所有的找零用钱全部都是从顾客那里获得,这里的数据量可以观察到不算特别的大,因此我们可以首先遍历所有的符合顾客人数的情况,比如4个顾客就用2的4次方表示情况的总数,用其二进制来表示每一种情况中出现1元和2元的情况,当前位为1则为1元,为0则为2元,在所有的情况下我们再进行逐个的判断,如果当前为0的时候就给空列表添加一个-1,为1则添加一个1,得到列表后对于每一词元素为-1的情况进行处理,如果当前元素为-1且前面的元素之和加上该-1小于0,则说明无法找回,这时就说明该种情况不符合初步筛选,将flag位置0,表示淘汰该情况,初步筛选可以得到符合“可以找零”情况的所有情况,然后进行第二次筛选,去掉1元和2元人数不符合题目要求的情况,这时只剩下排列组合了,由于这时每一种已成立的情况的0和1都不可以再换位置了,这时就将对应位置上的0和1的顺序进行排列组合,用当前已经筛选出的情况数乘以两种人数的阶乘,得到的就是最终的结果。
注意事项:1>>4指的是二进制右移,即为2的4次方,在代码中换为1>>总人数,表示初步筛选前的所有可能情况
参考代码:
def jiecheng(i):
jieguo=1
for j in range(1,i+1):
jieguo*=j
return jieguo
zong,yi,er=map(int,input().split())
count=0
for i in range(1<<zong):
flag=1
a = []
b=bin(i)[2:].zfill(zong)
if list(b).count("1")==yi and list(b).count("0")==er:
for j in range(len(b)):
if int(b[j]) == 1:
a.append(1)
else:
a.append(-1)
for k in range(len(a)):
if (sum(a[:k]) + a[k]) < 0:
flag = 0
break
if flag:
count += 1
print(count*(jiecheng(yi)*jiecheng(er)))
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复