基础动态规划题,状态转移方程为 dp[i] = min(dp[i-1] + singleT[i], dp[i-2] + doubleT[i-1]),其中 dp[i] 表示给 i 个人售票的最短时间,singleT[i] 表示给第 i 个人单独售票的时间,doubleT[i] 表示给第 i 和 i+1 个人同时售票的时间。(注意中午 12 点用 am)
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXK = 2005;
int singleT[MAXK], doubleT[MAXK]; //单人售票时间,双人售票时间
int dp[MAXK]; //总计最短售票时间
int main()
{
int N;
cin >> N;
int K;
while (N--)
{
cin >> K;
for (int i = 1; i <= K; i++)
{
cin >> singleT[i];
}
for (int i = 1; i <= K - 1; i++)
{
cin >> doubleT[i];
}
memset(dp, 0, sizeof(dp));
dp[1] = singleT[1];
for (int i = 2; i <= K; i++) //动态规划
{
dp[i] = min(dp[i - 1] + singleT[i], dp[i - 2] + doubleT[i - 1]);
}
int time = dp[K]; //最短售票总时间(秒)
int h, m, s; //时,分,秒
h = time / 3600 + 8;
time %= 3600;
m = time / 60;
time %= 60;
s = time;
if (h <= 12)
printf("%02d:%02d:%02d am\n", h, m, s);
else
printf("%02d:%02d:%02d pm\n", h - 12, m, s);
}
return 0;
}
继续加油。