注解
1、只有两种情况,要么每个人分别买票,要么相邻的两个人一起买票,找用时最短的。因此递推式:min(dp[i-1]+a[i], dp[i-2]+b[i])
2、a和b数组分别用于存:每个人分别买票的时间以及两个相邻的人一起买票的时间。a[i]和b[i]指的是以第i个人为结束的时间。
3、初始条件dp[0]=0,dp[1]=a[1]
4、注意时分秒的转换,以及am,pm的转换。(24小时制,因此要对24取余,大于等于12为pm,否则为am)
代码
#include <iostream>
using namespace std;
int main() {
int N;
cin>>N;
for(int i=0; i<N; i++){
int K;
cin>>K;
int a[K+1];
for(int j=1; j<=K; j++){
cin>>a[j];
}
int b[K+1];
for(int j=2; j<=K; j++){
cin>>b[j];
}
int dp[K+1];
dp[0] = 0;
dp[1] = a[1];
for(int j=2; j<=K; j++){
dp[j] = min(dp[j-1]+a[j], dp[j-2]+b[j]);
}
int sum = dp[K];
int hh = dp[K]/3600;
int mm = (dp[K]-hh*3600) /60;
int ss = dp[K]-hh*3600-mm*60;
hh += 8;
hh %= 24;
if(hh>=12){
hh -= 12;
printf("%02d:%02d:%02d pm\n", hh, mm, ss);
}
else{
printf("%02d:%02d:%02d am\n", hh, mm, ss);
}
}
return 0;
}