网易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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值