Tickets
不得不说这道题真的是一道简单的dp问题(不过比赛的时候居然被卡住了,想哭…………),特判一下k==1的时候,k!=1的时候就遍历每一个人,此时他有两种选择,一是前一个人一起买,二是他单独买,此时的状态转换方程应该为dp[i]=max(dp[i-1]+t1[i],dp[i-2]+t2[i-1]);
#include <iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<vector>
#include<queue>
#include<string>
#define mod 1000000007
using namespace std;
typedef long long ll;
const int maxn=2005;
const int inf=0x3f3f3f3f;
int n,cnt,dp[maxn*25],t1[maxn],t2[maxn];
int main()
{
scanf("%d",&n);
while(n--){
int k,ans=0;
scanf("%d",&k);
for(int i=1;i<=k;i++){
scanf("%d",&t1[i]);
//dp[i]=inf;
}
dp[0]=0,dp[1]=t1[1];
if(k==1){
ans=t1[1];
}
else{
for(int i=1;i<k;i++){
scanf("%d",&t2[i]);
}
for(int i=2;i<=k;i++){
dp[i]=min(dp[i-1]+t1[i],dp[i-2]+t2[i-1]);
}
ans+=dp[k];
}
int h=8+ans/60/60;
int m=ans/60%60;
int s=ans%60;
printf("%02d:%02d:%02d ",h,m,s);
if(h<12)
printf("am\n");
else
printf("pm\n");
}
return 0;
}