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("
");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/zufezzt/p/5137789.html