题解 | #游游的除2操作#python
游游的除2操作
https://www.nowcoder.com/practice/b797f46aa75145a0bbe112099f7cbd18
import sys def func(n, vec): # 一个数不用比较 直接是0 if n == 1: return 0 ##################################################################### # 排序 # 思路: # 1. 找v[0]与v[i]两个数除2向下取整 相等的数,相等的数是最少变化的 # 2. i--/i++ 重复步骤1,直至 (v[0] == v[i] || i == 0)/(i >= n) # ##################################################################### # 如何找两个数(a < b)除2向下取整 相等的数: # flag 初始值为false, true的时候说明正对v[0]以及之前操作过的数(与v[0]相等)做除2向下取整操作 # 1. b = int(b / 2) b除2向下取整 # 2. if flag == True count += 1 * i, else count += 1 # 3. 如果 a == b 结束计算 # 4. if a > b, a 与 b 互换,从步骤1 开始计算, flag取反 # 5. if a < b, 从步骤1开始计算 ##################################################################### vec.sort() count = 0 for i in range(1, n): if vec[0] == vec[i]: continue a = vec[0] b = vec[i] flag = False while(a != b): b = int(b / 2) if flag: count += 1 * i else: count += 1 if a > b: tmp = a a = b b = tmp flag = not flag vec[0] = a return count while True: try: # 读取输入 line1 = sys.stdin.readline().strip() line2 = sys.stdin.readline().strip().split() if not line1 or not line2: break n = int(line1) arr = list(map(int, line2)) if len(arr) == 1: print(0) else: # 输出结果 print(func(n, arr)) except EOFError: break