题目大意:有一个人在卖电影票,给出单卖给每个人的时间,和卖给两个连续的人的时间,问卖完所有电影票需要花费的最小时间
解题思路:用dp[i]表示卖了i张电影票所要花费的最小时间,得转移方程
dp[i] = min(dp[i - 1] + single[i], dp[i - 2] + double[i])
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 2010;
int one[N], two[N], dp[N];
int n;
void init() {
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d", &one[i]);
for (int i = 1; i <= n - 1; i++)
scanf("%d", &two[i]);
}
void solve() {
memset(dp, 0, sizeof(dp));
dp[0] = 0;
dp[1] = one[1];
for (int i = 2; i <= n; i++)
dp[i] = min(dp[i - 1] + one[i], dp[i - 2] + two[i - 1]);
int h = dp[n] / 3600 + 8;
dp[n] %= 3600;
int m = dp[n] / 60;
dp[n] %= 60;
if (h >= 12) printf("%02d:%02d:%02d pm\n", h - 12, m, dp[n]);
else printf("%02d:%02d:%02d am\n", h, m, dp[n]);
}
int main() {
int test;
scanf("%d", &test);
while (test--) {
init();
solve();
}
return 0;
}