Problem:
Score : 200 points

Problem Statement

There is a kangaroo at coordinate 0 on an infinite number line that runs from left to right, at time 0.
During the period between time i-1 and time i, the kangaroo can either stay at his position, or perform a jump of length exactly i to the left or to the right.
That is, if his coordinate at time i-1 is x, he can be at coordinate x-i, x or x+i at time i.
The kangaroo's nest is at coordinate X, and he wants to travel to coordinate X as fast as possible.
Find the earliest possible time to reach coordinate X.

Constraints

X is an integer.

1≤X≤10^9

Input

The input is given from Standard Input in the following format:

X

Output

Print the earliest possible time for the kangaroo to reach coordinate X.

Sample Input 1

6

Sample Output 1

3

The kangaroo can reach his nest at time 3 by jumping to the right three times, which is the earliest possible time.

Sample Input 2

2

Sample Output 2

2

He can reach his nest at time 2 by staying at his position during the first second, and jumping to the right at the next second.

Sample Input 3

11

Sample Output 3

5

Solution in C# (Mono 4.6.2.0) (judge verdict: Runtime Error)

using System;
using System.Linq;
using static System.Math;

class Program
{
    static int n, k;
    static long[] a;
    static bool[,] dp;
    static int before = 0;

    static void Main()
    {
        string[] s = Console.ReadLine().Split();
        n = int.Parse(s[0]);
        k = int.Parse(s[1]);
        a = Console.ReadLine().Split().Select(long.Parse).ToArray();
        Array.Sort(a);
        dp = new bool[n + 1, k];
        int l = -1;
        int r = n;
        while (r - l > 1)
        {
            int m = l + (r - l) / 2;
            if (Need(m))
            {
                r = m;
                continue;
            }
            l = m;
        }
        Console.WriteLine(r);
    }

    static bool Need(int x) // カードxが必要か
    {
        if (x == n) return true;
        if (x == -1) return false;
        dp[0, 0] = true;
        for (int i = before; i <= n; i++)
        {
            for (long j = 0; j < k; j++)
            {
                if (j >= a[i - 1] && i - 1 != x)
                    dp[i, j] = dp[i - 1, j] || dp[i - 1, j - a[i - 1]];
                else
                    dp[i, j] = dp[i - 1, j];
            }
        }
        bool f = false;
        for (long j = Max(0, k - a[x]); j < k; j++)
            f = f || dp[n, j];
        before = Max(0, x - 1);
        return f;
    }
}