7月18号算法作业--贪心算法..动态规划..不同排序问题

42 篇文章 0 订阅
39 篇文章 0 订阅

一.贪心算法问题:根据身高重建队列

假设有打乱顺序的一群人站成一个队列.每个人由整数对(h,k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数,编写一个算法来重建这个队列
代码示例如下:

arr = [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]  #初始状态
"""
思考过程如下:
7,0
7,0  7,1
7,0 6,1 7,1
5,0 7,0 6,1 7,1
5,0 7,0 5,2 6,1 7,1
5,0 7,0 5,2 6,1 4,4 7,1
"""
#[h,k] h为身高 k排在h前且升高大于h的人数
#结果要为[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]]
arr.sort(key=lambda arr:arr[0],reverse=True)
print(arr)
arr_end = []
for i in arr:
    a = i[1]
    arr_end.insert(a,i)
print(arr_end)

2.动态规划问题:三角形最小路径和

给定一个三角形,找出自顶向下的最小路径和,每一步只能移动到下一个相邻节点上.
代码示例如下:

arr = [
       [2],
      [3,4],
     [6,5,7],
    [4,1,8,3]
]
def min_path(arr):
    min_jend = 0
    for i in arr:
        min_j = min(i)
        min_jend += min_j
    return min_jend
min_end = min_path(arr)
print('最短路径为:',min_end)

3.动态规划问题:合唱团(网易笔试编程)

有n个学生战成一排,每一个学生有一个能力值,牛牛想从这n个学生中按照顺序选取k名学生,要求相邻两个学生的位置编号的差不能超过d,使得k个学生的能力乘积最大,
输入描述:
每一个输入包含一个测试用例,每个测试数据包含一个整数n(1<=n<=50),表示学生的个数;接下来的一行,包含n个整数按照每个学生的能力值aj(-50<=aj<=50);接下来的一行包含两个整数,k\和d(1 <= k <= 10,1 <= d <= 50).
代码案例如下:

student_amount = [3]
abil = [7,4,7]
k_d = [2,50]
num = k_d[0]
max_pro = 1
for i in range(num):
    if len(student_amount) <= k_d[1]:
        max_abil = abil.index(max(abil))
        max_pop = abil.pop(max_abil)
        max_pro *= max_pop
print(max_pro)

4.不同排序算法应用问题

排序的优化原则

  1. 需要被排序的总数比较小的时候,适合插入排序和选择排序;
  2. 需要被排序的总数很大的时候,建议使用归并[排序
  3. 需要被排序的数据基本有序的时候,适合直接插入排序调整一下即可
  4. 有重复且范围比较小或者位数比较固定,考虑基数排序或者桶排序
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值