HDU

Tickets

题目大意:

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

数据范围:

1n1000,0Si25s,0Di50s.

解题思路:

刚开始看数据范围2000,以为要n方做,之后写的时候发现直接一层循环就能实现状态的转移,之后处理一下输出的时间就行了。状态为:
dp[i]=min(dp[i1]+S[i],dp[i2]+min(D[i1],S[i1]+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
");
        else printf(" am
");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/TRDD/p/9813530.html