首页 > 试题广场 >

过河

[编程题]过河
  • 热度指数:3752 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧。在桥上有一些石子,青蛙很讨厌踩在这些石子上。由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上的一串整点:0,1,……,L(其中L是桥的长度)。坐标为0的点表示桥的起点,坐标为L的点表示桥的终点。青蛙从桥的起点开始,不停的向终点方向跳跃。一次跳跃的距离是S到T之间的任意正整数(包括S,T)。当青蛙跳到或跳过坐标为L的点时,就算青蛙已经跳出了独木桥。

题目给出独木桥的长度L,青蛙跳跃的距离范围S,T,桥上石子的位置。你的任务是确定青蛙要想过河,最少需要踩到的石子数。

数据范围:

输入描述:
第一行有一个正整数L ,表示独木桥的长度。
第二行有三个正整数S,T,M,分别表示青蛙一次跳跃的最小距离,最大距离,及桥上石子的个数
第三行有M个不同的正整数分别表示这M个石子在数轴上的位置(数据保证桥的起点和终点处没有石子)。
所有相邻的整数之间用一个空格隔开。


输出描述:
只包括一个整数,表示青蛙过河最少需要踩到的石子数。
示例1

输入

10
2 3 5
2 3 5 6 7

输出

2
头像 赫he
发表于 2023-07-15 20:23:35
如果不考虑L的范围,就是一道简单的dp题。f[i]表示走到位置i,踩到的石头个数的最小值,则f[i]=min(f[i], f[j] + flag[i]),其中flag[i]表示位置i是否是石子,j在[i-s, i-t]之间。当L很大时,但是石子个数很少最多只有100个,所以存在两个石子之间有很大的空 展开全文
头像 腰部以上的叛逆
发表于 2022-10-01 12:25:13
dp 29 过河 题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧。在桥上有一些石子,青蛙很讨厌踩在这些石子上。由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上的一串整点:0,1,……,L(其中L是桥的长度)。坐标为0的点表示桥的起点,坐 展开全文
头像 朱越峰
发表于 2022-04-20 19:45:06
对python来说,本题真正的难点在于l很大时如何不超时。 为此需要运用数论做一些粗浅的算法优化。 实际上还有很多能抠的细节没有抠,因为在python上的运行速度已经比较令人满意了,再去深究一些不能改变运算量数量级的地方意义不大。 注:由irises1412提供的答案应该是错误的,它通不过示例自测。 展开全文
头像 重生之我要当分子
发表于 2024-12-27 19:28:33
解题思路 这是一道动态规划优化的题目。关键优化点在于对状态空间的压缩: 直接DP会超时: 如果直接定义 为到达第 点的最小石子数 由于 可达 ,复杂度将达到 ,显然超时 状态空间优化: 观察到石子数 最多只有 个 两个石子间距离如果大于 ,中间的点可以压缩 对于距离大于 的 展开全文
头像 炎炎夏日丽丽在目
发表于 2023-06-03 18:00:35
#include <bits/stdc++.h> using namespace std; //此题解参考了 https://www.nowcoder.com/users/133865280 这位大佬的题解,尝试把他的思路解释得更加清晰 //若按照一般思路的dp,直接设开一个大小为L 展开全文
头像 sodoth
发表于 2025-04-18 17:30:14
动态规划 #include <climits> #include <iostream> #include <vector> using namespace std; int main() { int l,s,t,m, i, j; cin>& 展开全文