跳跃的蚂蚱

来源:互联网 发布:爱淘宝api 编辑:程序博客网 时间:2024/04/28 15:25

时间限制:C/C++语言 1000MS;其他语言 3000MS

内存限制:C/C++语言 65536KB;其他语言 589824KB
题目描述:

小B对脑筋急转弯问题很有兴趣,她觉得这种问题的挑战能够反映一个人的应急反应能力。她正在开发一个智力测试的游戏,游戏的主角是一个蚂蚱。蚂蚱最初位于0点处,可以在直线上向正向或反向两个方向跳跃。比较特别的是,蚂蚱每次跳跃的距离比前一次跳跃多一个单位,第一次跳跃的距离为一个单位。

小B的问题是,如果让蚂蚱跳跃到x处,需要经过多少次跳跃,你能解决这个问题吗?
输入

输入中有多组测试数据。每组测试数据为单独的一行,包含一个整数x(-10^9 =< x =< 10^9)。
输出

对每组测试数据,在单独的行中输出蚂蚱最少需要跳跃的次数。

样例输入

2

6

0
样例输出

3

3

0

我相信这到题看到的时候都会好不犹豫的写出像我写的这样的翔代码:

int leeco(int n) {    int sum = 0;    int step = 1;    int count = 0;    while (sum != n ) {        if (sum + step > n)            sum -= step;        else            sum += step;        count++;        step++;    }    return count;}

结果是只能a对17%,有可能还是测试用例0,后来越想越觉得这题像动态规划,可是呢,这动态规划里面子问题一直在增加,比如你第一次跳可以到1,和-1两个位置,第二次就在这基础上多两个位置,就成为了4个位置,而最后的位置和我们上一次的位置和将要跳跃的步数都有关系,所以这么做肯定是不怎么靠谱的。网上大神的解释,可以得出这题的解法:
令S(n)为跳的所有路程,x是我们要到达的目标,则S(n) = 1+2+3…+n,如果我们S(n)>x,我们需要折返,假设我们在m位置折返,那么我们比不折返少了2m,也就是说我们实际的距离S(n)-2m = x,才行,那么我们跳跃到x的条件就是(S(n) - x)必须是一个偶数,n就是我们的跳跃次数,如果S(n) - x是一个奇数,那么可以知道S(n+1)-x必定是一个偶数,这个时候是n+1次

int mazha(int x) {    int n = floor(sqrt(2.0 * x));    if (n * (n + 1) < 2 * x)        n += 1;    int flag = (int)abs(n * (n + 1) / 2 - x) & 1;//奇数还是偶数    return flag ? (n+1):n;//奇数(n+1)偶数(n)}

比较了两种方法前十位置的跳跃次数,就知道一开始的想法是错的了
test0正确值0暴力方法的值0
test1正确值1暴力方法的值1
test2正确值3暴力方法的值3
test3正确值2暴力方法的值2
test4正确值3暴力方法的值4
test5正确值4暴力方法的值6
test6正确值3暴力方法的值3
test7正确值5暴力方法的值5
test8正确值4暴力方法的值7
test9正确值5暴力方法的值9

0 0