题目大意:总共有N个人,给出每个人单独买票的时间,以及相邻两人一起买票的时间,求出N个人买完票后所用时间的最小值。
简单DP,注意下输出格式就行了。用数组one[i]表示第i个人单独买票所用的时间;用数组two[i]表示第i个人和第i-1个人一起买票所用的时间;再用数组dp[i]记录前i个人买完票后所用的最少时间。那么就可以写出其状态转移方程:dp[i]=min(dp[i-1]+one[i],dp[i-2],two[i])。代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main(){
int dp[10005];
int one[60005],two[60005];
int N,k;
int h,m,s;
char a[5]={'a','m'};
scanf("%d",&N);
while(N--){
scanf("%d",&k);
for(int i=1;i<=k;i++)
scanf("%d",&one[i]);
for(int i=2;i<=k;i++)//i从2开始!!
scanf("%d",&two[i]);
memset(dp,0,sizeof(dp));
dp[1]=one[1];
for(int i=2;i<=k;i++)
dp[i]=min(dp[i-1]+one[i],dp[i-2]+two[i]);
h=8+dp[k]/3600;//时
m=dp[k]%3600/60;//分
s=(dp[k]%3600)%60;//秒
if(h>=12){
if(h>12)
h-=12;
a[0]='p';
}
printf("%02d:%02d:%02d %s\n",h,m,s,a);
}
return 0;
}