hdu 1260 dp

View Code
//hdu 1260  dp

//题目说如何最快让每个人买到票,每组数据给出
//第一行:多少人买票(k),第二行:每个人买自己的一张票的时间(k个数),
//第三行:连续两个人一起买票的时间(比如 第一个数表示第一个人和
//第二个人一起买的时间,第二个数表示第二个人和第三个人一起的时间...(k-1个数))

//思路:dp[i]表示 到第i 个人买票的最少时间
//因此 dp[i] = min{ dp[i-1] + 第i 个人买票时间, dp[i-2] + (第i-1个人和第i一起买票的时间) }
//这样只要知道 dp[i-1] 和dp[i-2] 就可以了,因此可以用滚动数组优化空间

#include <stdio.h>
#include <string.h>

#define N 2005

int one[N], two[N], dp[3];

int main()
{
    int n_case, n_tick;
    scanf("%d", &n_case);
    while(n_case--)
    {
        scanf("%d", &n_tick);

        for(int i = 1; i <= n_tick; ++i)
            scanf("%d", &one[i]);

        for(int i = 1; i < n_tick; ++i)
            scanf("%d", &two[i]);

        dp[0] = 0;
        dp[1] = one[1];
        for(int i = 2; i <= n_tick; ++i)
        {   //记录到 第 i-1 个人的最少时间 加上 i 买票的时间
            int tmp = dp[(i-1) % 3] + one[i];

            //记录到 第 i-2 个人的最少时间 加上 (第i-1 个人 和 第i个人一起买票的时间)
            int now = dp[(i-2) % 3] + two[i-1];

            if(now < tmp)   //判断哪一种方式买票最省时间
                dp[i%3] = now;
            else
                dp[i%3] = tmp;
//            int tmp = dp[i-1] + one[i];
//            if(dp[i - 2] + two[i-1] < tmp)
//                dp[i] = dp[i-2] + two[i-1];
//            else
//                dp[i] = tmp;
        }
        int h, m, s;
        s = dp[n_tick%3] % 60;
        m = (dp[n_tick%3] / 60) % 60;
        h = (dp[n_tick%3] / 60 / 60) % 60 + 8;
//        s = dp[n_tick] % 60;
//        m = (dp[n_tick] / 60) % 60;
//        h = (dp[n_tick] / 60 / 60) % 60 + 8;

        //注意输出格式
        printf("%02d:%02d:%02d ", h, m, s);
        if(h < 12 || !(m+s))    //12:00以前或12:00:00为am
            puts("am");
        else
            puts("pm");
    }
    return 0;
}

 

posted @ 2012-04-16 20:32  gabo  阅读(167)  评论(0编辑  收藏  举报