解题思路:
先明白一点,如果所有数都只出现一次,则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分
4 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复