解题思路:
先明白一点,如果所有数都只出现一次,则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 人评分
数组输出 (C语言代码)浏览:811 |
C语言训练-最大数问题 (C语言代码)浏览:648 |
C语言程序设计教程(第三版)课后习题8.3 (C语言代码)浏览:436 |
上车人数 (C语言代码)浏览:816 |
母牛的故事 (C语言代码)浏览:992 |
C语言程序设计教程(第三版)课后习题6.6 (C++代码)浏览:649 |
求圆的面积 (C语言代码)浏览:1755 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:585 |
printf基础练习2 (C语言代码)浏览:547 |
神奇的fans (C语言代码)浏览:1124 |