传送门:HDU 1260 Tickets
分析:
一道简单的DP题,代码思路简单清晰。注意时间转化。不然WA。
代码如下;
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
#define ms(x, y) memset(x, y, sizeof(x))
const double PI = acos(-1.0), eps = 1e-8;
int main() {
int N,K[2002],kk[2002],dp[2002],n; // dp[i] 前i个人花的最短的时间
scanf("%d",&N);
while(N--) {
scanf("%d",&n);
ms(dp, 0);
for(int i=1; i<=n; i++)
scanf("%d",K+i);
dp[1] = K[1];
for(int i=2; i<=n; i++)
scanf("%d",kk+i);
for(int i=2; i<=n; i++)
dp[i] = min(dp[i-1] + K[i], dp[i-2] + kk[i]); // (两种抉择),对于第i个人,是单独缴费还是选择和前一个人一起缴费
// 转化成时间
int h = dp[n] / 3600;
int m = (dp[n] % 3600) / 60;
// int s = dp[n] - h*3600 - m*60;
int s = dp[n] % 60;
printf("%02d:%02d:%02d %s\n",(8+h)%24,m,s,(8+h)%24<12?"am":"pm");
}
return 0;
}