杰克最近正在努力锻炼他的跳跃技能。当前他正站在X坐标轴原点上。他想跳到坐标(x,0)上,为了达到训练效果,他决定首次跳跃的距离是1,之后每一次跳跃的距离将会比上一次跳跃的距离大1个单位。每一次跳跃,他可以选择往左或者往右跳。他很好奇至少要经过多少次跳跃才能到达终点。
Input
单组测试数据。 输入数据只包含整数x(-10^9<=x<=10^9)。Output
输出杰克到达终点所需要的最少的跳跃次数。Input示例
2Output示例
3这道题放在6星里面,简直了。。。一点算法用不到,看自己能不能想通,想通就很简单了
这里我们贪心的想,尽量向靠近的方向跳,如果跳过了,我们考虑超过的距离是奇数还是偶数,如果是偶数,那就很好办了,可以通过使步长为 (now-n)>>1 这一步向远离的方向蹦去,就刚好能到达n,如果是奇数,那就也好办,继续向原来的方向跳去,直到超过的步长是偶数即可,剩下的就同上了。
#pragma GCC optimize(2) #include<stdio.h> #include<algorithm> #include<string.h> #include<queue> using namespace std; const int maxn = 500; const int inf = 0x3f3f3f3f; typedef long long ll; int n; int main() { //freopen("C://input.txt", "r", stdin); scanf("%d", &n); if (n < 0) { n = -n; } int now = 0, ans = 0; int len = 1; while (now < n || (now - n) % 2) { ans++; now += len; len++; } printf("%d\n", ans); return 0; }
51nod 1615 跳跃的杰克
最新推荐文章于 2019-02-13 09:23:18 发布