博客
关于我
七月十一日训练总结
阅读量:277 次
发布时间:2019-03-01

本文共 1964 字,大约阅读时间需要 6 分钟。

为了解决这个问题,我们需要找到一个最小的整数 ( m ),使得 ( m ) 是“好”数,并且 ( m \geq n )。一个“好”数可以表示为不重复的3的幂次方的和。为了高效地解决这个问题,我们可以利用三进制数的特性来处理。

方法思路

  • 转换为三进制:首先将给定的整数 ( n ) 转换为三进制表示。
  • 处理进位:在三进制表示中,任何数字2都会导致我们需要进位处理。如果我们遇到数字2,我们将其和后面的所有0一起处理,将它们设为0,并将前面的位加1。
  • 处理进位的影响:可能会有多个连续的2,这会导致更高位的进位。我们需要继续处理这些进位,直到所有位都被正确处理。
  • 转换为十进制:处理完三进制数组后,将其转换回十进制,得到最终的结果 ( m )。
  • 解决代码

    def find_good_number(n):
    if n == 0:
    return 0
    # 转换为三进制数组,高位在前
    num = []
    while n > 0:
    num.insert(0, n % 3)
    n = n // 3
    # 处理数组中的2
    i = len(num) - 1
    while i >= 0:
    if num[i] == 2:
    # 找到最长的连续2
    j = i
    while j < len(num) and num[j] == 2:
    j += 1
    # 设为0
    for k in range(i, j):
    num[k] = 0
    # 如果j > i,说明后面还有2吗?不,因为已经处理i位置的2
    if j > i:
    j -= 1
    else:
    j = i
    # 找到最大的k < i,使得num[k] != 0
    k = i - 1
    while k >= 0 and num[k] == 0:
    k -= 1
    if k < 0:
    # 添加1在最高位
    num = [1] + num
    else:
    num[k] += 1
    # 处理进位
    while num[k] > 2:
    num[k] = 0
    carry = 1
    k -= 1
    if k < 0:
    num = [1] + num
    break
    num[k] += carry
    carry = num[k] // 3
    num[k] = num[k] % 3
    # 继续处理可能的进位带来的2,重新从左到右遍历
    i = 0
    break
    else:
    i -= 1
    # 转换为十进制
    m = 0
    for digit in num:
    m = m * 3 + digit
    return m
    q = int(input())
    for _ in range(q):
    n = int(input())
    print(find_good_number(n))

    代码解释

  • 转换为三进制:将整数 ( n ) 转换为三进制数组,高位在前。
  • 处理进位:从右到左遍历数组,遇到数字2时,处理连续的2,并进行进位处理。
  • 处理进位的影响:在处理进位时,可能会导致更高位的进位,因此需要继续处理,直到所有位都被正确处理。
  • 转换为十进制:将处理完的三进制数组转换为十进制数,得到结果 ( m )。
  • 这个方法确保了我们能够高效地找到满足条件的最小“好”数 ( m )。

    转载地址:http://wroo.baihongyu.com/

    你可能感兴趣的文章
    OpenCV 4.1.0版drawContours
    查看>>
    opencv glob 内存溢出异常
    查看>>
    opencv Hog Demo
    查看>>
    opencv Mat push_back
    查看>>
    OpenCV Python围绕特定点将图像旋转X度
    查看>>
    opencv resize
    查看>>
    opencv SVM分类Demo
    查看>>
    OpenCV VideoCapture.get()参数详解
    查看>>
    opencv videocapture读取视频cap.isOpened 输出总是false
    查看>>
    opencv waitKey() 函数理解及应用
    查看>>
    OpenCV 中的图像转换
    查看>>
    OpenCV 人脸识别 C++实例代码
    查看>>
    OpenCV 在 Linux 上的 python 与 anaconda 无法正常工作.收到未实现 cv2.imshow() 的错误
    查看>>
    Opencv 完美配置攻略 2014 (Win8.1 + Opencv 2.4.8 + VS 2013)上
    查看>>
    opencv 模板匹配, 已解决模板过大程序不工作的bug
    查看>>
    OpenCV 错误:(-215)size.width>0 &&函数imshow中的size.height>0
    查看>>
    opencv&Python——多种边缘检测
    查看>>
    opencv&python——高通滤波器和低通滤波器
    查看>>
    OpenCV-Python接口、cv和cv2的性能比较
    查看>>
    opencv1-加载、修改、保存图像
    查看>>