Jumps (Codeforces 1455B)
Tags: Math, constructive algorithms

You are standing on the $$$\mathit{OX}$$$-axis at point $$$0$$$ and you want to move to an integer point $$$x > 0$$$.You can make several jumps. Suppose you're currently at point $$$y$$$ ($$$y$$$ may be negative) and jump for the $$$k$$$-th time. You can:   either jump to the point $$$y + k$$$  or jump to the point $$$y - 1$$$. What is the minimum number of jumps you need to reach the point $$$x$$$?

Input: The first line contains a single integer $$$t$$$ ($$$1 \le t \le 1000$$$) — the number of test cases.The first and only line of each test case contains the single integer $$$x$$$ ($$$1 \le x \le 10^6$$$) — the destination point.

Output: For each test case, print the single integer — the minimum number of jumps to reach $$$x$$$. It can be proved that we can reach any integer point $$$x$$$.

Note: In the first test case $$$x = 1$$$, so you need only one jump: the $$$1$$$-st jump from $$$0$$$ to $$$0 + 1 = 1$$$.In the second test case $$$x = 2$$$. You need at least three jumps:   the $$$1$$$-st jump from $$$0$$$ to $$$0 + 1 = 1$$$;  the $$$2$$$-nd jump from $$$1$$$ to $$$1 + 2 = 3$$$;  the $$$3$$$-rd jump from $$$3$$$ to $$$3 - 1 = 2$$$; Two jumps are not enough because these are the only possible variants:   the $$$1$$$-st jump as $$$-1$$$ and the $$$2$$$-nd one as $$$-1$$$ — you'll reach $$$0 -1 -1 =-2$$$;  the $$$1$$$-st jump as $$$-1$$$ and the $$$2$$$-nd one as $$$+2$$$ — you'll reach $$$0 -1 +2 = 1$$$;  the $$$1$$$-st jump as $$$+1$$$ and the $$$2$$$-nd one as $$$-1$$$ — you'll reach $$$0 +1 -1 = 0$$$;  the $$$1$$$-st jump as $$$+1$$$ and the $$$2$$$-nd one as $$$+2$$$ — you'll reach $$$0 +1 +2 = 3$$$; In the third test case, you need two jumps: the $$$1$$$-st one as $$$+1$$$ and the $$$2$$$-nd one as $$$+2$$$, so $$$0 + 1 + 2 = 3$$$.In the fourth test case, you need three jumps: the $$$1$$$-st one as $$$-1$$$, the $$$2$$$-nd one as $$$+2$$$ and the $$$3$$$-rd one as $$$+3$$$, so $$$0 - 1 + 2 + 3 = 4$$$.

Sample Inputs:
5
1
2
3
4
5

Sample Outputs:
1
3
2
3
4

Solution (Python):
def search(x):
    lo = 0
    hi = 1500
    while hi - lo > 1:
        mid = (lo + hi) // 2
        y = mid * (mid + 1) // 2
        if x > y:
            lo = mid
        else:
            hi = mid
    if x == hi * (hi + 1) / 2 - 1:
        return hi + 1
    return hi
for _ in range(int(input())):
    x = int(input())
    print(search(x))

Solution (Python):
def solve():
    x = int(input())
    (l, r) = (1, 10 ** 8)
    num = r
    while l <= r:
        m = (l + r) // 2
        cur = m * (m + 1) // 2
        if cur == x:
            return m
        elif cur - x - 1 > 0:
            r = m - 1
            num = m
        else:
            l = m + 1
    return num
if __name__ == '__main__':
    for _ in range(int(input())):
        print(solve())

Solution (Python):
import math
T = int(input(''))
for i in range(T):
    n = int(input())
    m = math.ceil((-1 + math.sqrt(8 * n + 1)) / 2)
    num = m * (m + 1) // 2
    if num - n == 1:
        print(m + 1)
    else:
        print(m)