题意:给出一些人买票的时间,可以一个人买,也可以相邻两人一起买,求所有人买完票的最短时间。
思路:一维DP,dp[i]表示第i个人买票所需要的时间,这个人可以和前一个人一起买,也可以自己买。
状态转移方程:dp[i]=min(dp[i-1]+t1[i],dp[i-2]+t2[i-1]),然后再注意初始化和对时间的处理就行了。
AC代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
#define inf 0x7ffffff
int main()
{
int n,t1[2010],t2[2010],dp[2010];
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
dp[i]=inf;
for(int i=1;i<=n;i++)
scanf("%d",&t1[i]);
for(int i=1;i<=n-1;i++)
scanf("%d",&t2[i]);
dp[1]=t1[1];
for(int i=2;i<=n;i++)
{
dp[i]=min(dp[i-1]+t1[i],dp[i-2]+t2[i-1]);
}
// printf("%d\n",dp[n]);
int h=dp[n]/3600;
int m=dp[n]%3600/60;
int s=dp[n]%60;
printf("%02d:%02d:%02d ",(h+8)%24,m,s);
if((h+8)%24>12)
printf("pm\n");
else
printf("am\n");
}
return 0;
}