杰克最近正在努力锻炼他的跳跃技能。当前他正站在
X坐标轴原点上。他想跳到坐标
(x,0)上,为了达到训练效果,他决定首次跳跃的距离是
1,之后每一次跳跃的距离将会比上一次跳跃的距离大
1个单位。每一次跳跃,他可以选择往左或者往右跳。他很好奇至少要经过多少次跳跃才能到达终点。
Input
单组测试数据。 输入数据只包含整数x(-10^9<=x<=10^9)。
Output
输出杰克到达终点所需要的最少的跳跃次数。
Input示例
2
Output示例
3
#include <iostream>
#include <cmath>
using namespace std;
typedef long long ll;
int main()
{
ll n;
ll result = 0;
cin >> n;
n = abs(n);
ll left = 0;
ll right = n;
while (left < right - 1)
{
ll mid = left + (right - left) / 2;
ll sum = (1 + mid) * mid / 2;
if (sum >= n)
{
right = mid;
}
else
{
left = mid;
}
}
if ((1 + left) * left / 2 >= n)
{
result = left;
}
else
{
result = right;
}
while ((((1 + result) * result) / 2 - n) & 1)
{
result++;
}
cout << result << endl;
return 0;
}