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++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include<iostream>
#include<cstdio>
#include<cstring>
#define mid ((l+r)>>1)
#define N 5010
using namespace std;

int n,k,dp[20][N],num[N],ans;

void sol(int l,int r,int now)
{
	if(l==r)
	{
		int i;
		for(i=max(0,k-num[l]); i<k; i++)
		{
			if(dp[now][i]) break;
		}
		if(i<k) ans++;
		return;
	}
	int i,j;
	memcpy(dp[now+1],dp[now],sizeof(dp[now]));
	for(j=l; j<=mid; j++)
	{
		for(i=k-1; i>=num[j]; i--)
		{
			dp[now+1][i]|=dp[now][i-num[j]];
		}
	}
	sol(mid+1,r,now+1);
	memcpy(dp[now+1],dp[now],sizeof(dp[now]));
	for(j=mid+1;j<=r;j++)
	{
		for(i=k-1;i>=num[j];i--)
		{
			dp[now+1][i]|=dp[now][i-num[j]];
		}
	}
	sol(l,mid,now+1);
}

int main()
{
	int i,j;
	cin>>n>>k;
	for(i=1; i<=n; i++)
	{
		scanf("%d",&num[i]);
	}
	dp[0][0]=1;
	sol(1,n,0);
	cout<<n-ans;
}