HDU 1260 Tickets
dp[i]表示到i这个人所用的最少时间
状态转移方程 dp[i]=min(dp[i-1]+a[i],dp[i-2]+b[i-1]);
最后转换一下时间就可以了,当小时大于等于12的时候显示pm,其余显示am
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int maxn=2000+10; int T,n; int a[maxn],b[maxn]; int dp[maxn]; int main() { scanf("%d",&T); while(T--) { scanf("%d",&n); memset(dp,0,sizeof dp); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n-1;i++) scanf("%d",&b[i]); dp[1]=a[1]; for(int i=2;i<=n;i++) dp[i]=min(dp[i-1]+a[i],dp[i-2]+b[i-1]); int ss=dp[n]+8*60*60; int h=ss/3600; ss=ss-h*3600; int m=ss/60; ss=ss-m*60; int s=ss; printf("%02d:%02d:%02d ",h,m,s); if(h<12) printf("am"); else printf("pm"); printf("\n"); } return 0; }