青蛙过桥
-
描述
Description
在
河上有一座独木桥,
一只青蛙想沿着独木桥从河的一侧跳到另一侧。
在桥上有一些石子,
青蛙很讨
厌踩在这些石子上。由于桥的
长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达
的点看成数轴
上的一串整点:
0
,
1
,……,
L
(其中
L
是桥的长度)。坐标为
0
的点表示桥的起点,坐
标为
L
的点表示桥的终点。青蛙从桥的起点开始,不停的向终点
方向跳跃。一次跳跃的距离是
S
到
T<
/p>
之间的任
意正整数(包括
S,T
)。当青蛙跳到或跳过坐标为
L
的点时,就算青
蛙已经跳出了独木桥。
p>
题目给出独木桥的长度
L
,青蛙跳跃的距离
范围
S,T
,桥上石子的位置。你的任务是确定青蛙要想过
p>
河,最少需要踩到的石子数。
对于
30%
的数据,
L <=
10000
;
对于全部的数据,
L <=
10^9
。
输入格式
Input
Format
输入的第一行有一个正整数
L
(
1 <= L <= 10^9
)
,
表示独木桥的长度。
第二行有三个正整数
S
< br>,
T
,
M
,分别表示青蛙一次跳跃的最小距离,最大距离,及桥上石子的个数,其中
1 <=
S <= T <= 10
,
1 <=
M <= 100
。第三行有
M
个不同的正整数分别表示这
M
个石子在数轴上
的位置(数据保证桥的起点和终
点处没有石子)。所有相邻的整数之间用一个空格隔开。
输出格式
Output Forma
t
输出只包括一个整数,表示青蛙过河最少需要踩到的石子数。
解析:本题目是自己碰到的第一个动态规划题目,遇到的难度也是前所未有。自己只能窘
迫的说水平太低
了,连续提交了十几遍才通过,这还是在参考别人代码的基础上
AC
的。顺别吐槽一下,
Vijos
的系统也实
在太差了,自动删除回车换行打乱格式导致编译通不过,最后还
逼着我换了
firefox
才可以顺利提交。
< br>
思路一:也是自己最开始的思路,我想到了递归求解此问题。虽然对于样例很容
易的通过,但是提交之后
10
组测试数据,没有一对是正确的,
各种窘迫,考虑到数据规模还以为是自己的数据类型定义的太小,还
专门换成了
long
类型,但是提交之后仍然出错,这是关注错误信息,发现给出的
是堆栈溢出,这时候就
是傻子也会想到应该是递归层次太多导致的,看到那个
L
的范围,溢出也是理所应当的。不得不放弃这种
思路,但是自己有不会别的思路,只能参考网友上各种牛们提供的代码。下面是自己的递归代码,还是后
者脸皮贴出来吧。
1.
#include
#include
#include
2.
int
NumStone = 101;
3.
int
IsStone(
int
destinaton,unsigned
int
Stone[],
int
M)
4.
{
5.
int
high = M -1;
6.
int
low = 0;
7.
while
(low <= high)
8.
{
9.
int
mid =
(low + high) / 2;
10.
if
(destinaton == Stone[mid])
11.
return
mid+1;
12.
if
(destinaton
13.
high = mid - 1;
14.
else
15.
low = mid + 1;
16.
}
17.
return
0;
18.
}
19.
void
select(unsigned
int
a[],
int
count)
/*
将石子出现的位置排序
*/
20.
{
21.
int
i,j,temp;
22.
23.
for
)
,关键是如何
在处理时把这些“空长条”跳过,使得运算次数降到
M
次。结论:
若(采用跳跃距离
p
p>
和
p+1
时可以跳
至任何位置
Q
),则在
Q
≥
P*
(
P-1
)时是一定有解的。
Because
证明
由于
p
与
p+1
间隔
1,
故方程