今天學長參加了樂視的面試,題目是這樣的:
一只螞蟻,從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;
}