537. 偶数 [贪心]

description

从高位开始扫描,遇到奇数x时,可以采取两种措施:

  1. x = x-1,此时新数字小于原数字,为了按键次数最少,新数字要尽可能大。当x后的数字都取8时,新数字最大。
  2. x = x+1,此时新数字小于原数字,为了按键次数最少,新数字要尽可能小。当x后的数字都取0时,新数字最小。

需要注意的是,当x=9进行+1操作时,会产生进位,还有可能导致高位的进一步进位。不过在这种情况下,操作数必然会大于进行-1操作,所以特判一下即可。

import math
if __name__ == '__main__':
    T = int(input())
    for Case in range(1, T+1):
        s = input()
        num = int(s)
        res = 0
        for i in range(len(s)):
            if (ord(s[i])-ord('0')) % 2 == 1:
                if (s[i]=='9'):
                    s = s[0:i] + '8' + '8'*(len(s)-i-1)
                    res = num - int(s)
                    break
                s = s[0:i] + chr(ord(s[i])-1) + '8'*(len(s)-i-1)
                num1 = int(s)
                
                s = s[0:i] + chr(ord(s[i])+2) + '0'*(len(s)-i-1)
                num2 = int(s)
                # print("nums: ", num1, num2);
                res = min(num-num1, num2-num)
                break
        print("Case #{}: {}".format(Case, int(res)))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值