站点图标 AI技术聚合

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)#打印次数

版权声明:本文为博主作者:gravity312原创文章,版权归属原作者,如果侵权,请联系我们删除!

原文链接:https://blog.csdn.net/weixin_73616356/article/details/135766249

退出移动版