今天学长参加了乐视的面试,题目是这样的:
一只蚂蚁,从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;
}