21计科程一帆


私信TA

用户名:uq_88617846948

访问量:5228

签 名:

搞哥毛哥在上,俺寻思俺是一个最大最强的技术小子

等  级
排  名 959
经  验 3415
参赛次数 2
文章发表 52
年  龄 19
在职情况 学生
学  校 石河子大学
专  业 计算机科学与技术

  自我简介:

憨憨一个,欢迎大佬指正

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

  评论区

  • «
  • »