51NOD-1615 跳跃的杰克

题目来源:  CodeForces
基准时间限制:1 秒 空间限制:131072 KB 分值: 80  难度:5级算法题
 收藏
 关注
杰克最近正在努力锻炼他的跳跃技能。当前他正站在X坐标轴原点上。他想跳到坐标(x,0)上,为了达到训练效果,他决定首次跳跃的距离是1,之后每一次跳跃的距离将会比上一次跳跃的距离大1个单位。每一次跳跃,他可以选择往左或者往右跳。他很好奇至少要经过多少次跳跃才能到达终点。

 


Input
单组测试数据。
输入数据只包含整数x(-10^9<=x<=10^9)。
Output
输出杰克到达终点所需要的最少的跳跃次数。
Input示例
2
Output示例
3

这其实是一道数学题,首先只考虑 终点在他的右方(当然也可以只考虑 终点在他的左方)或者 终点就在原
点。排除原点之后,剩下的就两种方式到达终点(1)一直向右跳直接到终点;(2)在向右跳的过程中有
向左跳的的时候。
无论哪一种种情况一定遵守一条规律:他跳的总数-他到终点需要跳的数=他向左侧跳的数*2;接下来就是
寻找需要跳的最短的次数。
#include<stdio.h>
int main()
{
    int i=0,x,num=0;//num作为跳跃的总数
    scanf("%d",&x);
    if(x==0){printf("0\n");return 0;}//当终点在原点时,直接输出
    if(x<0)x=-x;//如果向左跳就视为向右跳同样的距离
    while(1)
    {
        num=num+i;
        if(num>=x&&(num-x)%2==0)//跳的总数-到终点跳的数=向左侧跳的数*2
            {printf("%d\n",i);return 0;}
        i++;
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值