DP - Tickets - HDU - 1260
发布日期:2021-05-07 20:03:39 浏览次数:6 分类:技术文章

本文共 1933 字,大约阅读时间需要 6 分钟。

DP - Tickets - HDU - 1260

题意:

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

输入:

T 组 测 试 样 例 , T组测试样例, T

每 组 包 括 一 个 正 整 数 n , 表 示 排 队 的 人 数 每组包括一个正整数n,表示排队的人数 n

接 着 n 个 正 整 数 , 表 示 每 个 人 单 独 买 票 的 时 间 s i 接着n个正整数,表示每个人单独买票的时间s_i nsi

最 后 n − 1 个 正 整 数 , 表 示 每 个 人 与 前 一 个 人 一 起 买 票 花 费 的 时 间 t i , i ≥ 2 最后n-1个正整数,表示每个人与前一个人一起买票花费的时间t_i,i\ge 2 n1tii2

Sample Input

2220 254018

Sample Output

08:00:40 am08:00:08 am

数据范围:

1 ≤ T ≤ 10 , 1 ≤ n ≤ 2000 , 0 s ≤ S i ≤ 25 s , 0 s ≤ t i ≤ 50 s 1\le T\le 10,1\le n\le 2000,0s\le S_i\le 25s,0s\le t_i\le 50s 1T10,1n2000,0sSi25s,0sti50s


分析:

对 于 每 个 人 而 言 , 要 么 单 独 购 买 , 要 么 与 前 一 个 人 一 起 购 买 。 对于每个人而言,要么单独购买,要么与前一个人一起购买。

记 f [ i ] : 表 示 前 i 个 人 购 票 的 最 少 时 间 。 记f[i]:表示前i个人购票的最少时间。 f[i]:i

第 i 个 人 单 独 购 买 的 最 少 花 费 : f [ i ] = f [ i − 1 ] + s [ i ] 第i个人单独购买的最少花费:f[i]=f[i-1]+s[i] if[i]=f[i1]+s[i]

第 i 个 人 与 前 一 个 人 一 起 购 买 的 最 小 花 费 : f [ i ] = f [ i − 2 ] + t [ i ] 第i个人与前一个人一起购买的最小花费:f[i]=f[i-2]+t[i] if[i]=f[i2]+t[i]

状 态 转 移 方 程 在 二 者 中 取 较 小 值 。 状态转移方程在二者中取较小值。

经 计 算 , 排 队 最 多 耗 时 5000 s < 2 h , 因 此 我 们 不 需 要 担 心 时 间 从 上 午 到 下 午 。 经计算,排队最多耗时5000s<2h,因此我们不需要担心时间从上午到下午。 5000s<2h

代码:

#include
#include
#include
#include
#include
using namespace std;const int N = 2010;int f[N], n;int T;int s[N], t[N];int main(){ scanf("%d",&T); while(T--) { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&s[i]); for(int i=2;i<=n;i++) scanf("%d",&t[i]); f[1] = s[1]; for(int i=2;i<=n;i++) f[i]=min(f[i-1]+s[i], f[i-2]+t[i]); int sum = f[n]; int h = sum/3600, m = (sum%3600)/60, sec = sum%60; h+=8; printf("%02d:%02d:%02d am\n",h,m,sec); } return 0;}
上一篇:DIJ(最短路条数和具体方案) - 紧急救援 - 天梯赛 L2-001
下一篇:DP(数塔问题) - 免费馅饼 - HDU - 1176

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2025年04月06日 17时44分56秒