解题思路:本题目给出了买糖总人数以及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.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论