题目:
现在有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