刷华为od编程题用python

308 阅读1分钟

1、身高体重排序

2、寻找停车位

3、垃圾信息拦截

动态规划类题目

1、士兵过河

def shorter_time(a,b):
    return a*10 if a*10<b else b
if __name__ == "__main__":
    N = int(input())
    t = int(input())
    time_list = sorted(map(int,input().split()))
    L = len(time_list)

    dp = [0]*L
    #这里注意,直接利用time_list[0]判断与t的关系
    if time_list[0] > t:
        print("0 0")
    #这里注意需要else
    else:
        dp[0] = time_list[0]
        #这里注意加判断条件if n > 1
        if L > 1:
            dp[1] = shorter_time(time_list[0],time_list[1])
            if dp[1] > t:
                print(f"0 {dp[0]}")
            else:
                for i in range(2,L):
                    #两种情况,i-1未过河与i-1过河,注意需要加前面的这个dp[i-2]与dp[i-1],第一个未过河这里,最后是+shorter_time(dp[0],dp[1]),这里还是要判断一下,不可直接写成dp[1]
                    dp[i] = min(dp[i-2]+time_list[0]+shorter_time(time_list[i-1],time_list[i])+dp[1]+shorter_time(dp[0],dp[1]),dp[i-1]+time_list[0]+
                                shorter_time(time_list[0],time_list[i]))
                    if dp[i] > t:
                        print(f"{i} {dp[i-1]}")
                        break
                else:
                    print(f"{L} {dp[L-1]}")

2、机智的外卖员

image.png

五步法分析动态规划

1、确定dp数组以及下标的含义。 2、确定递推公式 3、dp数组如何初始化 4、确定遍历顺序 5、举例推导dp数组

N,M = map(int,input().split())
if N>M:
    print(0)
    exit
#1、确定dp数组以及下标的含义。dp[i]代表到达第i层需要的最短时间
dp = [0]*(M+1)
for i in range(1,N + 1):
    dp[i] = N - i
for i in range(N+1,M+1):
    if i % 2 == 0:
        #要注意这里的dp[i//2]+1,后面是+1
        dp[i] = min(dp[i-1]+1,dp[i//2]+1)
    else:
        dp[i] = min(dp[i-1]+1,dp[(i+1)//2]+2)
print(dp[M])