baldwin


私信TA

用户名:dotcpp0659047

访问量:2403

签 名:

等  级
排  名 30014
经  验 509
参赛次数 0
文章发表 2
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

TA的其他文章

阶乘的和(AC)
浏览:945

解题思路:

先明白一点,如果所有数都只出现一次,则m为min(Ai)。有(min(Ai)+1)个min(Ai)!,m才能变为min(Ai)+1,具体来说,有:3!+3!+3!+3!=4*3!==4!

那思路就有了:从最小值A1开始往上遍历,必须满足其个数为(A1+1)的倍数,不然break;若为k倍,则(A1+1)!的个数加上k,依次往下做,直到最后一个数An的个数k<(An+1),那么循环结束。输出字典中唯一的值。


参考代码:

n = int(input())
lst1 = list(map(int, input().split()))
# 建立字典存储
lst = dict()
for i in lst1:
   if i not in lst:
       lst[i] = 0
   lst[i] += 1
flag = 1
i = 0
for i in sorted(lst.keys()):
   a = lst[i]//(i+1)
   b = lst[i]%(i+1)
   if b != 0:
       flag = 0
       break
   else:
       if i+1 not in lst:
           lst[i + 1] = 0
       lst[i+1] += a
       del lst[i]
if flag == 0:
   print(i)
else:
   p = i+1
   q = lst[i+1]
   while lst[p] >= p+1:
       a = lst[p] // (p+1)
       b = lst[p] % (p+1)
       if b != 0:
           break
       lst[p+1] = a
       del lst[p]
       p = p+1
   for i in lst.keys():
       print(i)

 

0.0分

6 人评分

  评论区

  • «
  • »