网易2021秋招算法笔试排队问题(python)

题目:
现在有n个人排队买票,已知早上8点开始卖,每个人有两种买法,单独买第i个人花费a[i]秒;和后面一个人一起买,第i和第i+1个人一共花费b[i]秒。求最早什么时候可以结束排队
输入
2#样例组数
2#排队人数
20 25#a[i]
40#b[i]
1#排队人数
8#a[i]
输出
08:00:40 am
08:00:08 am

思路:用动态规划求解,dp[i]是第i个人完成排队的最小时间。每个人有两种选择,第一种自己买,第二种和前面一个人一起买,因为是前i个人,所以不能和后面那个人一起买。dp[i]=min(dp[i-1]+a[i],dp[i-2]+b[i-1])。因为受前两个的影响,初始化dp[1]=a[1](第一个人只能自己买),dp[2] = min(dp[1]+a[2],dp[0]+b[1]),所以dp[0]也需要初始化,没人的时候不用排队所以为0,后面的都可以通过状态转移获得。
代码如下:(部分细节在代码标注中)

n = int(input())
for i in range(n):
    num = int(input())
    if num == 0:#没人的话,排队直接结束
        print('08:00:00 am')
    elif num == 1:#只有一个人的时候没有b[i]
        a = int(input())
    else:
        list1 = list(map(int,input().split()))
        list2 = list(map(int,input().split()))
        dp = [0 for _ in range(num+1)]
        dp[1] = list1[0]
        for i2 in range(2,num+1):
            dp[i2] = min(dp[i2-1]+list1[i2-1],dp[i2-2]+list2[i2-2])
        a = dp[num]#最终需要排队的总用时
    x = a//3600#处理成时间表示
    y = a%3600//60
    z = a%3600%60
    if (x+8)>12:
        print(str(x-4).rjust(2,'0')+':'+str(y).rjust(2,'0')+':'+str(z).rjust(2,'0'),'pm')
    else:
        print(str(x+8).rjust(2,'0') + ':' + str(y).rjust(2, '0') + ':' + str(z).rjust(2, '0'), 'am')
        #rjust(2,'0')是将8变成08,对象是str
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页