当前位置:   article > 正文

Lab-P3-分治_python lab3-p3分治法

python lab3-p3分治法

第一关:分治法

任务描述

编写程序,实现从屏幕输入列表A的值,然后通过调用min_max()函数计算所输入的列表A的最小值和最大值。

算法原理介绍

用分治法同时求n个数a1​,a2​,...,an​中的最小值Min(1, n)和最大值Max(1, n)的基本思想是:

  1. 要求Min(1, n)和Max(1, n),可以先求得Min(1, n/2)和Min(n/2+1, n)以及Max(1, n/2)和Max(n/2+1, n),Min(1, n/2)和Min(n/2+1, n)中较小的就是Min(1, n),Max(1, n/2)和Max(n/2+1, n)中较大的就是Max(1, n)……直到要求Min(1, 1)和Max(1, 1),……,Min(n,n)和Max(n,n)。
  2. 根据Min(i, j)和Max(i, j)的定义可知:Min(1, 1)= Max(1, 1) =a1,……,Min(n, n)=Max(n, n)=an。
  3. 知道了Min(1, 1)和Max(1, 1),……,Min(n, n)和Max(n, n),通过分别比较Min(1,1)和Min(2,2),Max(1,1)和Max(2,2)可以得到Min(1, 2)和Max(1, 2)……直到得到Min(n-1, n)和Max(n-1,n);同理通过分别比较Min(1,2)和Min(3,4),Max(1,2)和Max(3,4)可以得到Min(1,4)和Max(1,4)……直到得到Min(n-3,n)和Max(n-3,n)……直到得到Min(1,n)和Max(1,n)。

注意事项

本节内容中仅可以调用下列两个函数:

1. min(a, b)--返回a和b中较小的元素

2. max(a, b)--返回a和b中较大值元素

编程要求

根据提示,在右侧编辑器补充代码,计算并输出列表的最大值和最小值。

测试说明

测试输入:

2,3,4,4.5,65.7

预期输出:

Minimum and Maximum: 2,  65.7

  1. def min_max(a):
  2. # # 参数a为列表,编写分治法函数,返回a的最大值和最小值
  3. # # 注意,有两个返回值
  4. if len(a) == 1:
  5. return a[0], a[0]
  6. elif len(a) == 2:
  7. return min(a), max(a)
  8. m = len(a) // 2
  9. lmin, lmax = min_max(a[:m])
  10. rmin, rmax = min_max(a[m:])
  11. return min(lmin, rmin), max(lmax, rmax)
  12. if __name__ == '__main__':
  13. # #编写代码,输入列表A,A列表中的都是数字
  14. A = [eval(i) for i in input().split(",")]
  15. # #输入A的的最大值和最小值
  16. # #下面这行代码不用修改哦~
  17. print("Minimum and Maximum: %g, %g" % (min_max(A)))

第二关:找假币问题

任务描述

依然是分治算法。

相关知识

找假币问题是一个比较简单且典型能够体现计算思维的问题。假设现在有n(n>=2)枚硬币,已知其中一枚为假币,且知道假币的重量是比真币轻的,请思考如何用分治思想解决该问题。

算法原理

本次实验中我们采用二分法解决假币问题。二分法是一个非常典型的分治思想的应用。

  1. 如果n是偶数,将n个硬币平均分成两份,直接比较这两份硬币的重量,假币在重量较轻的那份硬币中,继续对重量较轻的那一份硬币使用二分法,直到找出假币;
  2. 如果n是奇数,则随意取出一种的一枚硬币,将剩下的n-1枚硬币等分成两份。如果这两份硬币重量相同,则随机取出的那枚硬币即为假币;否则,按照硬币数为偶数是的处理办法继续执行算法。

编程要求

这一关比较特殊,要求你对你的每一行代码进行注释,说明它的用途,最终函数运行结果是假币的位置索引和假币的重量。

如果没有假币,索引和重量位置均为-1。

测试说明

测试输入:

3,3,3,3,3,3,3,2,3

预期输出:

position is: 7 ,weight is: 2.

  1. # # 全部都自己写8
  2. def find_coin(a, L):
  3. x = len(L) # 获取L的长度,即硬币的总数
  4. if x == 1: # 当硬币的数量为一时,就不用找了
  5. return a # 直接返回a
  6. if x % 2 == 1: # 当数量是奇数时
  7. x -= 1 # 舍弃最后一个硬币
  8. y = 1 # 记有一个硬币多余
  9. else: # 否则
  10. y = 0 # 记为没有硬币多余
  11. if sum(L[:x // 2]) > sum(L[x // 2:x]): # 如果前一半硬币质量的总和大于后一半硬币质量的总和
  12. return find_coin(a + x // 2, L[x // 2:x]) # 用同样的方法再次比较前一半硬币和后一半硬币的质量
  13. elif sum(L[:x // 2]) < sum(L[x // 2:x]) and y == 1: # 如果前一半硬币质量的总和小于后一半硬币质量的总和
  14. return find_coin(a, L[:x // 2]) # 用同样的方法再次比较前一半硬币和后一半硬币的质量
  15. else: # 如果两者质量相等
  16. if y != 0: # 如果有多余的硬币
  17. if L[0] > L[x]: # 如果第一个硬币的质量大于我们一开始剔除的硬币的质量
  18. return x # 那么我们就返回最后一个硬币的位置
  19. else: # 否则
  20. return -1
  21. else: # 如果没有多余的硬币
  22. return -1
  23. L = [int(i) for i in input().split(",")]
  24. a = 0
  25. m = find_coin(a, L)
  26. if m != -1:
  27. print(f"position is: {m}, weight is: {L[m]}.")
  28. else:
  29. print("position is: -1, weight is: -1.")

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

闽ICP备14008679号