螞蟻左右走走走問題

今天學長參加了樂視的面試,題目是這樣的:
一只螞蟻,從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,815評論 0 2
  • 326. Power of Three Given an integer, write a function to...
    跑者小越閱讀 2,156評論 0 1
  • 因為你的一個笑,我沉淪,如果你想走,我不留你,但請把我的心還給我, 是吧,他應該是不喜歡我了吧,可能連最初的一...
    想飛s閱讀 216評論 0 0
  • 3月1日盤口精要:靜待市場向上。
    雄獅財經閱讀 73評論 0 0
  • 最近,寶貝是真的長大了。 長大的最明顯標志是,有自己的想法了。 珺祎這幾天晚上每天都是很晚才睡覺,而且越晚越來勁,...
    旦旦日記閱讀 428評論 0 7