HDU - 1260 DP

Tickets

题目大意:

售票员想尽可能早的下班,现在有n个人,每个人购票都有一个时间 Si S i ,然后也给你两个相邻的人一起售票所需的时间 Di D i ,现在要你帮助售票员尽可能快的售完票,并且输出该售票员的下班时间,开始售票时间为 08:00:00  am. 08 : 00 : 00     a m .

数据范围:

1n1000,0Si25s,0Di50s. 1 ≤ n ≤ 1000 , 0 ≤ S i ≤ 25 s , 0 ≤ D i ≤ 50 s .

解题思路:

刚开始看数据范围2000,以为要n方做,之后写的时候发现直接一层循环就能实现状态的转移,之后处理一下输出的时间就行了。状态为:
dp[i]=min(dp[i1]+S[i],dp[i2]+min(D[i1],S[i1]+S[i])) d p [ i ] = m i n ( d p [ i − 1 ] + S [ i ] , d p [ i − 2 ] + m i n ( D [ i − 1 ] , S [ i − 1 ] + S [ i ] ) )
dp[i]代表售完第i的人的票所需的最短时间,第一部分是自己一个人售票,第二个是和相邻的前一人一起。

AC代码:

#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int maxn = 2000;
int a[maxn + 5], b[maxn + 5];
int hour, minute, second;
int T, n;
int dp[maxn + 5];
int main() {
    scanf("%d", &T);
    while(T--) {
        memset(dp, 0, sizeof(dp));
        hour = 8;
        minute = second = 0;
        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];
        for(int i = 2; i <= n; i++) {
            dp[i] = min(dp[i - 1] + a[i], dp[i - 2] + min(a[i - 1] + a[i], b[i - 1]));
        }
        bool flag = 0;//记录是上午还是下午,下午是从12:00:00开始的,到13:00:00就变成了1:00:00(上下午肯定是12小时制的啦)
        second = dp[n];
        minute = second / 60;
        second %= 60;
        hour += minute / 60;
        minute %= 60;
        if(hour >= 13)hour %= 12, flag = 1;
        if(hour < 10)printf("0");
        printf("%d:", hour);
        if(minute < 10)printf("0");
        printf("%d:", minute);
        if(second < 10)printf("0");
        printf("%d", second);
        if(flag == 1)printf(" pm\n");
        else printf(" am\n");
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值