51Nod--1615跳跃的杰克(贪心)

题目:
杰克最近正在努力锻炼他的跳跃技能。当前他正站在X坐标轴原点上。他想跳到坐标(x,0)上,为了达到训练效果,他决定首次跳跃的距离是1,之后每一次跳跃的距离将会比上一次跳跃的距离大1个单位。每一次跳跃,他可以选择往左或者往右跳。他很好奇至少要经过多少次跳跃才能到达终点。

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

输入样例
2

输出样例
3

解析:贪心思想,假如能直接跳到终点那就直接跳。要是不能跳到终点,那肯定是要往回跳一次的,实际往回跳的距离是2*x,那最少的跳跃次数肯定是你超过终点前的次数 + (当前位置 - 终点位置)是偶数时的次数。为什么这么说,举个例子就很明显,假如你的终点是7,前三次跳到的位置是6,那这时候肯定还要往前跳,第四次跳就是到10,这时候(10-7)= 3,是一个奇数,那我假如让前面的某一次跳跃往左跳,比如我让第二次往左跳,那就是10 - 2 * 2 = 6,当前位置就是6,显然不能达到终点,那此时可以选择继续往前跳,下一步跳到15,而(15-7) = 8,这时候是偶数了,8 / 2 = 4,说明我可以在第四次跳跃的时候往左边跳,也就是15 - 2 * 4 = 7,这时候就跳到终点,是最优策略。

AC代码:

#include<bits/stdc++.h>
using namespace std;

int main()
{
	int x;
	cin >> x;
	if(x < 0) x = -x;
	int ans = -1, step = 0;
	for(int i = 0; ; i++)
	{
		ans++;
		step += i;
		if(step >= x && (step - x) % 2 == 0)
		{
			cout << i;
			break;
		}
	}
	return 0;
}

posted @ 2020-06-14 15:16  ~K2MnO4  阅读(195)  评论(0)    收藏  举报