http://acm.hdu.edu.cn/showproblem.php?pid=1260
用dp[i]表示处理到第i个的时候用时最短。
那么每一个新的i,有两个选择,第一个就是自己不和前面的组队,第二就是和前面的组队。
那么dp[i] = min(dp[i - 1] + a[i], dp[i - 2] + b[i]); 前者是自己组队。
边界条件 dp[0] = 0; dp[1] = a[1];
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL; #include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string> const int maxn = + ;
int a[maxn];
int b[maxn];
int dp[maxn];
void work() {
int n;
scanf("%d", &n);
for (int i = ; i <= n; ++i) {
scanf("%d", &a[i]);
}
for (int i = ; i <= n; ++i) {
scanf("%d", &b[i]);
}
dp[] = ;
dp[] = a[];
for (int i = ; i <= n; ++i) {
dp[i] = min(dp[i - ] + a[i], dp[i - ] + b[i]);
}
// cout << dp[n] << endl;
int addHour = dp[n] / / ;
int addMin = (dp[n] / ) % ;
int addSec = dp[n] % ;
printf("%02d:%02d:%02d ", + addHour, addMin, addSec);
if ( + addHour > ) {
printf("pm\n");
} else if ( + addHour == ) {
if (addMin || addSec) {
printf("am\n");
} else printf("pm\n");
} else printf("am\n");
return;
}
int main() {
#ifdef local
freopen("data.txt","r",stdin);
#endif
int t;
scanf("%d", &t);
while (t--) work();
return ;
}