python蓝桥杯保险箱问题(非动态规划)

先对问题进行分析,需要改变的数为两个数之差,如(67)变为(12)需要变化的数为55,

我们的目标是把55变为00所用的最少次数。55变为00有两种方法:1.先把55后面一个5变为10,用的次数为5,数据变为60再把6变为0,可以把6增长到10或减到0,显然增长到10用的次数少,所以该种方法所用的次数9。2.把后面一个5减少到0,用的次数为5,数据变为50,因为5为最后的一个数据,它变为10或0所用的次数都为5,该方法所用的次数为10次。结果显而易见,第一种方法为最佳方案。所当前数据(f[i])为5时,我们需要判断下一个数据(f[i-1])是否大于或等于5,当下一个数据(f[i-1])大于等于5成立时,我们需要将当前数据(f[i])增长到10(次数加5,f[i-1]+1)所用的次数最少,当前数据(f[i])大于5或小于5时,则可以直接增长到10(次数加10-f[i],f[i-1]+1)或直接减少到0(次数加f[i])。最后输出sum次数。

n=int(input())
s=int(input())
s1=int(input())
f1=max(s1-s,s-s1)#取需要改变的数绝对值,如12345,24659,需要改变的数为12314
f1=str(f1)
f=[]
for i in range(len(f1)):#把该数转化为列表【1,2,3,1,4】
    f.append(int(f1[i]))
sum=0
for i in range(len(f1)-1,-1,-1):#分类讨论
    if f[i]==10:#当需要改变的数为10时,需要向前进1,当前数据清零
        f[i-1]+=1
        f[i]=0
    if f[i]==5:#当数为5时,次数加5,数值可以当10或0
        sum+=5
        if f[i-1]>=5:#当f[i-1]数值大于等于5时,f[i]增长到10时,可以向前进1(f[i-1]+1)
            f[i-1]+=1#向前进1,所用的次数就可以少一次,如把55变00,先把后面一个5调到10,前面一个5变为6,6再到10,用的次数为4,一共为9次。比10次少
    if f[i]>5:#大于5只能增到10
        sum+=10-f[i]
        f[i-1]+=1
    elif f[i]<5:#小于5只能减到0
        sum+=f[i]
print(sum)#打印次数

  • 11
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值