题解 | #游游的除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

全部评论

相关推荐

评论
点赞
收藏
分享
牛客网
牛客企业服务