DP-hdu1260

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

题目描述:

题目大意:每一个人去电影票买票,有两种买票方法:1、自己单人买;2、与前面的人一起买;Joe是售票员,他想要早点下班,因此需要你编程序计算他能下班的最早时间。

 解题思路:首先用一个数组a来存放每个人自己一个人买票所需时间,再用一个数组dou来存从第二个人开始,每个人与前面一个人合并买票所需时间,因为第一个人的前面不可能有人了(除了售票员Joe,哈哈),所以第一个人的买票时间是确定了的为a[1]。采用动态规划来解决此问题,动态转移方程式为

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

即:第i个人买票所花的最少时间等于min(  前面i-1个人 买票所花时间  加上 第i个人(自己) 买票所花时间, 前面的i-2个人 买票所花时间 加上 第i个人与第i-1个人(自己与前面那人)合并买票所花时间);

代码实现:

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int dp[2000];
int main()
{
    int n,a[2000],k,dou[2000];//a数组存放单人买票所花时间,dou数组存放与前面那人一起买票所花时间
    scanf("%d",&n);
    while(n--)
    {
        memset(dp,0,sizeof(dp));
        memset(a,0,sizeof(a));
        memset(dou,0,sizeof(dou));
        scanf("%d",&k);
        for(int i=1;i<=k;i++)
            scanf("%d",&a[i]);
        for(int i=2;i<=k;i++)
            scanf("%d",&dou[i]);
        dp[1]=a[1];//第一个人买票时间是固定了的,因为他的前方不再可能有人与他一起买票了
        for(int i=2;i<=k;i++)//从第二个人开始遍历,找出最终的买票时间
            dp[i]=min(dp[i-1]+a[i],dp[i-2]+dou[i]);
        int h=dp[k]/3600;///记录最终的时间
        int m=dp[k]%3600/60;
        int s=dp[k]%60;
        printf("%02d:%02d:%02d%s\n",(8+h)%24,m,s,(h+8)%24>12?" pm":" am");//输出时间hh:mm:ss的简单操作
    }
    return 0;
}

 

posted @ 2018-11-19 09:47  里昂静  阅读(125)  评论(0编辑  收藏  举报