题目大意:
k个人排队,每个人单独买票要Si秒,和前面的人一起买要Di秒,求最快多长时间买完票
思路:
dp[i]表示前i人买完票的最短时间
dp[i] = min(dp[i - 1] + s[i], dp[i - 2] + d[i])
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 2010;
int dp[maxn], s[maxn], d[maxn];
int t, k;
int main()
{
scanf("%d", &t);
while (t--)
{
scanf("%d", &k);
for (int i = 1; i <= k; i++)
{
scanf("%d", &s[i]);
}
for (int i = 2; i <= k; i++)
{
scanf("%d", &d[i]);
}
int sec = 0;
dp[0] = 0;
dp[1] = s[1];
for (int i = 2; i <= k; i++)
{
dp[i] = min(dp[i - 1] + s[i], dp[i - 2] + d[i]);
}
sec = dp[k];
int min = sec / 60;
sec %= 60;
int hour = 8 + min / 60;
min %= 60;
if (hour > 12) printf("%02d:%02d:%02d pm\n", hour - 12, min, sec);
else printf("%02d:%02d:%02d am\n", hour, min, sec);
}
}