蚂蚁左右走走走问题

今天学长参加了乐视的面试,题目是这样的:
一只蚂蚁,从x轴原点出发,第n次走n或-n步,n为自然数,问到z(z属于R)的最少次数。

我和几个朋友想了很久,后来通过7s学弟的提示,终于想到了解法。

思路:
首先学姐的想法是贪心,从1加到某个数,但是之后就没有思路。
后来我们想到了暴力枚举,二叉树剪枝,觉得实在是麻烦。
7s说不能纯贪心,要想到对符号进行回溯,他的思路是:

举个例子,比如到9,那么就有:
1+2+3=6<9,少了,就要加
1+2+3+4=10>9,多了,就要减,回溯。
1+2+3-4+5=7<9,少了,就再回溯一次。
1+2-3+4+5 = 9==9 ,ok,其中-3就是这个数列的唯一负数

海冬同学通过这个思路总结出,那个唯一的负数就是差值的一半,即15-9=6,6/2=3。这个d=1的等差数列去掉任何一个元素,前后的和相差2,差值的奇偶性不变,因此需要多添加一个元素来改变n*(n+1)/2的奇偶性

#include<iostream>
#include<cstdlib>
#include<cmath>
using namespace std;
int main()
{
   int z,n;
   while ( cin>>z )
   {
     n = sqrt( 2 * abs(z) );
     for(;( n * (n+1) / 2 - z) % 2 !=0; n++);
     cout << n << endl;
   }
   return 0;
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 找出数组中重复的数字 题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,...
    BookThief阅读 1,849评论 0 2
  • 326. Power of Three Given an integer, write a function to...
    跑者小越阅读 2,187评论 0 1
  • 因为你的一个笑,我沉沦,如果你想走,我不留你,但请把我的心还给我, 是吧,他应该是不喜欢我了吧,可能连最初的一...
    想飞s阅读 229评论 0 0
  • 3月1日盘口精要:静待市场向上。
    雄狮财经阅读 79评论 0 0
  • 最近,宝贝是真的长大了。 长大的最明显标志是,有自己的想法了。 珺祎这几天晚上每天都是很晚才睡觉,而且越晚越来劲,...
    旦旦日记阅读 462评论 0 7