有k个人要买票,第i个人自己买花费时间alone[i],第i个人与相邻的人一起花费时间together[i],求所有人都买完花费的最少时间。
dp[i][0]代表前i个人买完并且第i个人是单独买的时候的最小花费时间,
dp[i][1]代表前i个人买完并且第i个人是和他的前一个一起买的的状态下的最小花费时间。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100000+10;
#define INF 0x3f3f3f3f
int dp[maxn][2];
int together[maxn],alone[maxn];
int k;
void Init()
{
memset(dp,0,sizeof(dp));
memset(alone,0,sizeof(alone));
memset(together,0,sizeof(together));
}
int main()
{
int T;
cin >> T;
while(T--)
{
Init();
cin >> k;
for(int i = 0 ; i < k ; i++)
{
scanf("%d",&alone[i]);
}
for(int i = 0 ; i < k-1 ; i++)
{
scanf("%d",&together[i]);
}
dp[0][0] = alone[0];
dp[0][1] = INF;
for(int i = 1 ; i < k ; i++)
{
dp[i][0] = min(dp[i-1][0] , dp[i-1][1]) + alone[i];
dp[i][1] = min(dp[i-2][1] , dp[i-2][0]) + together[i-1];
// else if(i == 1) dp[i][1] = toge
}
int ans = min(dp[k-1][1] , dp[k-1][0]);
int h,m,s;
h = ans / 3600 + 8;
m = (ans % 3600) / 60;
s = (ans % 60);
if(h > 12)
{
h -= 12;
printf("%02d:%02d:%02d pm\n",h,m,s);
}
else
{
printf("%02d:%02d:%02d am\n",h,m,s);
}
// cout << << endl;
}
return 0;
}