公式很简单,就是初值要处理好就可以了
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int inf=9999999;
int s[2005],d[2005],dp[2005][2];//dp[i][0]第i个数独立处理时,前i个数的最大值 dp[i][1]第i个数和前面的数一起处理时,前i个数的最大值
int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int t,n;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=1;i<=n;i++) {
dp[i][0]=inf;
dp[i][1]=inf;
}
for(int i=1;i<=n;i++) scanf("%d",&s[i]);
for(int i=2;i<=n;i++) scanf("%d",&d[i]);
dp[1][0]=s[1]; dp[1][1]=s[1];
dp[0][0]=0; dp[0][1]=0;
for(int i=2;i<=n;i++){
dp[i][0]=min(dp[i-1][1],dp[i-1][0])+s[i];
dp[i][1]=min(dp[i-2][0],dp[i-2][1])+d[i];
}
int ans=min(dp[n][0],dp[n][1]);
int h,m,s;
h=ans/3600;
ans=ans%3600;
m=ans/60;
ans=ans%60;
s=ans;
int flag=0;
if(8+h>=12) {
flag=1;
h-=12;
}
if(8+h<10) printf("0%d:",8+h);
else printf("%d:",8+h);
if(m<10) printf("0");
printf("%d:",m);
if(s<10) printf("0");
if(flag==0) printf("%d am\n",s);
else printf("%d pm\n",s);
}
}