2015-10-29 3 views
7

私はこの問題を数週間から解決しようとしていますが、解決策には到達できませんでした。 2つの数字XとYの両方が1になります。有効なオプションは、一度にX+YまたはY+Xです。特定の数に達するのに必要な反復の最小回数を見つける必要があります。特定の合計に達するための最小反復回数を確認

例:数がある場合は5

X=1, Y=1; X = X+Y 

X=2, Y=1; Y = X+Y 

X=2, Y=3; Y = Y+X 

X=2, Y=5; Stop answer reached 

私のテイク:数はのは、今すぐ値= 22が今= 11 22を分割最大数を探す1で23、デクリメントを言わせ奇数の場合

X=11; Y=1 ; Y=Y+X 

X=11; Y=12; X=X+Y 

X=23, answer reached 

しかし、私は特定のポイントに到達しても、X =必要な値を言うように、このアプローチの問題は、私は再帰的に特定の数に達することができないで、Yの値が取得されますように、1つのを追加することにより、数に到達私はそれを再利用して別の値に達することはできません

+0

数学のサイトでこの質問をすることはできますか? –

+1

1つの観察:各ステップの後に可能な異なる結果を持つツリーを構築すると、1ステップで{(1-1)}、2番目に{(2-1)}、 3)}、第3に、 {(4-1)、(3-4)、(5-3)、(2-5)}など。各ステップで得られる最大値はフィボナッチ数{1、 1,2,3,5,8 ...}となる。ステップが進むにつれて、すべての値が1からフィボナッチ数までの各ステップに入力されますが、ステップ5では6が欠落しています。ステップ6では1から13まで、ステップ7ではすべて1から21までですが、もっと進んだわけではありませんが、それは何らかの既知のシーケンスかもしれません{6、20、..}わかりません。 –

+1

だから私のhypotesisは、それらの魔法の数字(6、20、...)を除いて、その木の高さに必要な数字を得るための最小のステップ数になります。例えば、67を得る必要があるなら、フィボナッチ数55の前にすることはできませんが、おそらくフィボナッチが89である次のステップに表示されます。木の高さが10になると10ステップが得られます。フィボナッチは5、フィーチャは7、高さは7です。 5として7は5と8の間にあります。しかしそれは単なる示唆にすぎません。 –

答えて

6

今、私はO(nlogn)のソリューションを提供できます。

方法はgreatest common divisor

使用f(x, y)のように思えるが、この状態にイテレーションの最小数を表します。 の場合は、x>yまたはf(x,y-x)の場合はx<yの場合はこの状態になります。状態(x, y)に到達する方法は一意であることがわかります。O(logn)のように計算すると、gcdのようになります。

答えはmin(f(n, i) | 1 <= i < n)あるので、複雑さがO(nlogn)

Pythonコードです:

def gcd (n, m): 
    if m == 0: 
     return n 
    return gcd (m, n%m) 

def calculate (x, y): 
    if y == 0: 
     return -1 
    return calculate (y, x%y) + x/y 

def solve (n): 
    x = 0 
    min = n 
    for i in xrange (1, n): 
     if gcd (n, i) == 1: 
      ans = calculate (n, i) 
      if ans < min: 
       min = ans 
       x = i 
    print min 

if __name__ == '__main__': 
    solve (5) 
+0

:-)今のコードを行きますよ? – fjardon

+0

のx≤yはXを意味するので - Y≤0 – gnasher729

+0

をその条件のGCD(N、I)= 1の場合を可能にするので、あなたが、結果Nに至る追加を通してそのGCD(X、Y)= 1を言及すべきですもしN≤4 N-1のステップを必要とする、あなたがNと仮定することができる場合を除く。> I> N/2およびステップの数は1 +の計算である(I、N - 1)。 nが偶数ならば、私は奇数でなければならないので、奇数iだけを反復して速度を改善することができます。 – gnasher729

4

数字がそれほど大きくない(たとえば1000未満)場合は、breadth-first searchを使用できます。

各頂点が数字のペアである(X,Y)であり、そのような各頂点から頂点への2つのエッジが(X+Y,Y)(X,X+Y)である有向グラフを考えてみましょう。必要なポジションに達するまで、(0,0)からそのグラフ上のBFSを実行します。

+0

範囲は最大10000 –

+0

です@MayurKulkarni、BFSもそのために動作するはずです。私たちは、 '' X <= y'状態から '(X-Y、Y)'と '状態(x、y)を達することができないのはなぜ – Petr

+0

おかげで、私は –

関連する問題