解题思路:

先明白一点,如果所有数都只出现一次,则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.0分

4 人评分

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

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

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

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

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

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

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

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

评论列表 共有 0 条评论

暂无评论