Tickets---hdu1260 (简单dp)

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

题意就是有n个人排队买票,每个人需要的时间是a[i] (1=< i <=N),但是现在可以两个人合买, 合买只能和前面一个人或者后面一个人合买,所用时间已知,

求n个人都买完票所需要的时间;

我们可以用dp【i】表示前i个人需要用的时间,可以分析第i个人他可能自己买(dp[i] == dp[i-1]+a[i]),或者和前面一个人合买(dp[i] == dp[i-2]+b[i-1]);

因为每个人和他后面的一个人合买可以看成后面一个人和前面一个人合买;

#include<stdio.h>
#include<string.h>
#include<queue>
#include<algorithm>
using namespace std;

#define N 2200
#define INF 0xfffffff

int main()
{
    int T, n, a[N], b[N], dp[N];
    scanf("%d", &T);
    while(T--)
    {
        memset(dp, 0, sizeof(dp));
        scanf("%d", &n);
        for(int i=1; i<=n; i++)
        {
            scanf("%d", &a[i]);
        }
        for(int i=1; i<n; i++)
        {
            scanf("%d", &b[i]);
        }
        dp[1]=a[1];
        dp[2]=min(a[1]+a[2], b[1]);
        for(int i=3; i<=n; i++)
        {
            dp[i] = min(dp[i-1]+a[i], dp[i-2]+b[i-1]);
        }

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

        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-08-18 08:58  西瓜不懂柠檬的酸  Views(791)  Comments(0)    收藏  举报
levels of contents