題意:給出一些人買票的時間,能夠一個人買。也能夠相鄰兩人一起買,求全部人買完票的最短時間。
思路:一維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;
}
