Tickets---hdu1260(简单dp)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1260

题意是有n个人排队买票,第 i 个人买票所需要的时间是a[i],这个人和 i-1 或者 i+1 合买的时间是b[i];

当然每个人都要等到前面所有的人都买完了才能买,我们求所需总时间至少是多少,工作人员早上8点上班,问几点才能下班;

dp[i] 表示前i个人所发费的最小总时间,那么第i个人有两种选择自己买或者和前面的一起买(和后面一起买可以看成后面的人和他前面的人一起买)所以

dp[i] = min(dp[i-1] + a[i], dp[i-2]+b[i]);

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
#define N 2100
#define INF 0xffffff

int main()
{
    int T, n, a[N], b[N], dp[N];
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d", &n);

        memset(dp, 0, sizeof(dp));
        for(int i=0;i<=n+1; i++)
            a[i]=b[i]=INF;

        for(int i=2; i<=n+1; i++)
            scanf("%d", &a[i]);
        for(int i=3; i<=n+1; i++)
            scanf("%d", &b[i]);

        for(int i=2; i<=n+1; i++)
            dp[i]=min(dp[i-1]+a[i], dp[i-2]+b[i]);

        n=n+1;
        int s=dp[n]%60;
        int m=dp[n]/60%60;
        int h=8+dp[n]/3600;

        if(h>12)
            printf("%02d:%02d:%02d pm\n", h-12, m, s);
        else
            printf("%02d:%02d:%02d am\n", h, m, s);
    }
    return 0;
}
View Code

 

posted @ 2015-10-29 14:54  西瓜不懂柠檬的酸  Views(137)  Comments(0Edit  收藏  举报
levels of contents