10.保险箱

本文介绍了一个关于如何通过最少操作次数将初始数字a调整为目标数字y的编程问题,涉及数字位移、进位规则和动态规划算法求解最优化问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码视频及来源: 



放寒假了,蓝桥杯怎么准备 | 每日一题 | AcWing 5408. 保险箱_哔哩哔哩_bilibili

问题描述
小蓝有一个保险箱,保险箱上共有n位数字
小蓝可以任意调整保险箱上的每个数字,每一次操作可以将其中一位增加1或减少1。
当某位原本为9或0时可能会向前(左边)进位/退位,当最高位(左边第一位)上的数字变化时向前的进位或退位忽略
例如: 00000的第5位减1变为 99999; 99999的第5位减1变为99998;00000的第4位减1变为99990;97993的第4位加1变为98003:99909的第3位加1变为00009
保险箱上一开始有一个数字a,小蓝希望把它变成y,这样才能打开它,问小蓝最少需要操作的次数。
输入格式
输入的第一行包含一个整数n。
第二行包含一个n位整数。
第三行包含一个n位整数y。
输出格式
输出一行包含一个整数表示答案

import os
import sys
#https://www.bilibili.com/video/BV1u94y1M7HU/?spm_id_from=333.337.search-card.all.click&vd_source=dd04fffeb7894a8a703070ebf26af762
# 请在此输入您的代码
import sys

N = 100010

a = [0] * N
b = [0] * N
f = [[sys.maxsize] * 3 for _ in range(N)]  # sys.maxsize代表一个较大的数,类似C++中的0x3f3f3f3f

n = int(input())
str1 = input()
str2 = input()

for i in range(len(str1)):
    a[i] = int(str1[i])
    b[i] = int(str2[i])

f[n][1] = 0 #索引从0开始所以变为0,1,2
for i in range(n - 1, -1, -1):
    for j in range(3):   #j是进位状态,原本是-1,0,1 ,但索引从0开始所以变为0,1,2
        for k in range(-9, 10): #k是每一位操作的次数 -9-9
            for t in range(-1, 2): #t是进位/借位/不进不借 -1,0,1
                if a[i] + k + t - b[i] == (j - 1) * 10:  #a[i]+k+t表示变完后的最终结果,式子表示该位最终结果减去目标值对上一位的影响(-10,0,10)
                    f[i][j] = min(f[i][j], f[i + 1][t + 1] + abs(k))

print(min(min(f[0][0], f[0][1]), f[0][2]))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vsropy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值