dp训练计划——hdu1260简单dp

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

题目大意:

现在有n个人要买电影票,如果知道每个人单独买票花费的时间,还有和前一个人一起买花费的时间,问最少花多长时间可以全部买完票。

Input

给出 N(1<=N<=10),表示有N组样例     

给出K (1<=K<=2000),表示有K个人买票..     

给出K个数表示这个人单独买票会花的时间..保证每个数 (0s<=Si<=25s)     

给出K-1个数,表示这个人和前面那个人一起买票会花的时间..保证每个数 (0s<=Si<=50s)

Output

对于每一组数据,你需要给出电影院售票结束的时间,售票开始的时间为 08:00:00 am. 时间格式为: HH:MM:SS am|pm. 具体看样例输出

Sample Input

2
2
20 25
40
1
8

Sample Output

08:00:40 am
08:00:08 am

题解:

不难想出状态为dp[i]表示前i个人买票的最短时间.

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

即表示要么选择第i-1个人和第i个人一起买,要么选择第i个人单独买。

 然后总秒数就是dp[n],在进行一下时间转换就行了。

代码实现:

#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<queue>
#define PI atan(1.0)*4
#define E 2.718281828
#define rp(i,s,t) for (register int i = (s); i <= (t); i++)
#define RP(i,t,s) for (register int i = (t); i >= (s); i--)
#define ll long long
#define ull unsigned long long
#define mst(a,b) memset(a,b,sizeof(a))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define debug printf("ac\n");
using namespace std;
inline int read()
{
    int a=0,b=1;
    char c=getchar();
    while(c<'0'||c>'9')
    {
        if(c=='-')
            b=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9')
    {
        a=(a<<3)+(a<<1)+c-'0';
        c=getchar();
    }
    return a*b;
}
const int INF = 0x3f3f3f3f;
const int N = 1e5+7;
int dp[N],a[N],b[N];
int main(){
    int T=read();
    while(T--){
        int n=read();
        rp(i,1,n) a[i]=read();
        rp(i,2,n) b[i]=read();
        mst(dp,INF);
        dp[0]=0,dp[1]=a[1];
        rp(i,2,n) dp[i]=min(dp[i-2]+b[i],dp[i-1]+a[i]);
        int ans=dp[n];
        // cout<<dp[n]<<endl;
        if((8+ans/3600)%24<=12&&(8+ans/3600)%24>=0) printf("%02d:%02d:%02d am\n",(8+ans/3600)%24,ans/60%60,ans%60);
        else printf("%02d:%02d:%02d pm\n",(8+ans/3600)%24,ans/60%60,ans%60);
    }
    return 0;
}
/*
1 7
3
3 3
6 6
2 2 
*/  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值