【2018NOIP普及组】T3 摆渡车

本文详细介绍了NOIP普及组中P5017摆渡车问题的解决思路。重点讲解了如何通过深度搜索(DFS)结合记忆化的方法求解每个人在不同开车时间下的最小等待时间,以及如何进行剪枝避免超时。讨论了在特定情况下,以某个时间开始行驶可能并非最优解,并给出了示例解释。

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

P5017 摆渡车
题目传送门
思路:

  1. 对于每一个人他的最长等待时间为m-1。车刚走,他下分钟到。
  2. f[i][j]表示第i个人等j分钟的所有人的最小等待时间(最优解)。注意:第i个人等0分钟(他来就开车),不一定是最优的。
  3. 深搜第i人在开车时间为st时得最优解,把它的值赋给f[i][st-a[i]]; (记忆化)
  4. 第i个人在开车时间为st时,这班车上(车)的人总等待时间=st*(j-i)-sum;sum为上车的人到达时间和。然后再加上第j个人,开车时间为(st+m)的最优值(dfs(j,st+m),我们就初步得到一个最优解(不一定是最优的)
  5. 接下来对于best,我们还需更新最优值;(如果 第i个人后还有人没上车,那么以st为开车时间不一定是最优的)这里我给出一种情况,大家就比较好理解了。只有2个人,第一个1分钟时到,第二个人2分钟到,m=10,st=1并不是最优的。
    要想不超时,记忆化+剪枝是法宝!
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);
using namespace std;
const int MAX=2147483647;
const int N=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值