最短时间【题解】

这是一篇关于算法题目的解析,主要介绍了如何使用动态规划求解一个与洛谷P1880石子归并类似的问题。题目背景是在番禹夜间动物园,每人买票所需时间不同,每次最多买两张票。目标是找出使所有人都买到票的最短总时间。文章提供了两种解法,一种通过状态转移方程,另一种采用简化版石子归并思路,并附有AC代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GHOJ的一道dp题

题目描述

OIer们今晚要去参观番禹夜间动物园,那里有一个远近闻名的俄罗斯马戏团,其票很难买到,一场最多只能有400个人观看演出,当然是一个人要一张票,而售票处规定,一个人每次最多只能买两张票。可是每个人去买票很是浪费时间,OIer们想,如果其中有n个人买票,如何才能节省时间呢?

假设第i同学买一张票需要时间ti(1≤i≤n),队伍中相邻的两位OIer(第j个人和第j+1个人)也可以由其中一位买两张票,而另一位就可以不用排队了,则这两位同学(第j个人和第j+1个人,1≤j≤n-1)买两张票的时间变为rj。假如rj小于t[j]+t[j+1],则这样做就可以缩短后面的同学的等待时间,加快整个买票的过程。

现给出n,ti和rj的值,请编程求出使每个人都买到票的最短时间。

输入格式

共三行,

第一行是一个200以内的整数n(n≤200);
第二行包含n个由至少一个空格分隔的0-100之间的整数ti(ti<100);
第三行包含n-1个由至少一个空格分隔的0-100之间的整数ri(ri<100)。

输出格式

一行,为售票处售票的总时间。

输入样例

7
5 4 3 2 1 4 4
7 3 4 2 2 4

输出样例

14

解题思路

解法1

看到这道题,想必大家都能想到洛谷的P1880石子归并吧,其实两题都很类似,我们只要用石子归并的思想做这道题即可。

设 f[i][j] 表示从第 i 个人到第 j 个人排队买票的最短时间,则我们可以写出状态转移方程:

f[i][j] = min{ f[i][j],f[i][k - 1] + f[i][k + 2] + double_time[k] } (i <= k < j)

初始化:f[i][j] = time[i] + time[i + 1] + time[i + 2] + … + time[j]

解法1 AC代码

#include<iostream>
#include<algorithm>
using namespace std;
int tam[210],tm,s[210];
int n,f[210][210];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值