AcWing 4553. 卖票
设 \(f_i\) 表示对于前 \(i\) 个顾客开票所需的最短时间,\(f_i=\max\{f_{i-1}+a_i,f_{i-2}+b_i\}\)
左边表示单选,右边表示一块选。
// #define FILE_INPUT
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define rep(i, a, b) for (int i = a, END##i = b; i <= END##i; i++)
#define per(i, a, b) for (int i = a, END##i = b; i >= END##i; i--)
void Init();
void Solve();
signed main() {
// cin.sync_with_stdio(0);
// cin.tie(0), cout.tie(0);
#ifdef FILE_INPUT
freopen("input.in", "r", stdin);
#endif
int T = 1;
cin >> T;
while (T--) {
Init();
Solve();
}
return 0;
}
using LL = long long;
using ULL = unsigned long long;
const int Mod = 1e9 + 7;
const int Inf = 0x3f3f3f3f;
const LL InfLL = 0x3f3f3f3f3f3f3f3f;
const int N = 1e6 + 10;
int f[N], n, a[N], b[N];
void Init() {
}
void Solve() {
cin >> n;
rep(i, 1, n) cin >> a[i];
rep(i, 2, n) cin >> b[i];
f[1] = a[1];
rep(i, 2, n) f[i] = min(f[i - 2] + b[i], f[i - 1] + a[i]);
int s = f[n];
int mi = s / 60; s %= 60;
int h = mi / 60 + 8; mi %= 60;
if (h < 12) printf("%02d:%02d:%02d am\n", h, mi, s);
else if (h == 12) printf("%02d:%02d:%02d pm\n", h, mi, s);
else printf("%02d:%02d:%02d pm\n", h - 12, mi, s);
}

浙公网安备 33010602011771号