当前位置:   article > 正文

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次数。

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/385750
推荐阅读
相关标签
  

闽ICP备14008679号