2013-03-30 1 views
6

円にはnの子供がいます。それぞれにはいくつかのキャンディーがあります(マイナス、プラス、ゼロ)。彼らは一度に彼らの隣人に一つのキャンディーを与えることができます。最終的な結果は、すべてが最小限のステップでキャンディーをゼロにする必要があるということです。丸でキャンディーに配布する最小化手順

我々は(-4, -2, 4, 2)キャンディーと4人の子供を持っていると仮定し、次いで配列は

  1. (-3、-2、4、1)
  2. (-2、-2、4、0)
  3. あろう
  4. (-2、-1、3、0)
  5. (-2、0、2、0)
  6. (-2、1、1、0)
  7. (-2、2、0、0 )
  8. (-1,1,0、 0)
  9. (0、0、0、0)

これは一つの可能​​な答えは、私はステップの最小数を見つける必要があります。

  • ループ1:隣人が正のキャンディーを持っているならば、キャンディーの数がゼロに等しくなるまで、負のキャンディーで隣人にそれを与えるとの和に与えられたキャンディーの数を追加し、見つけます。

  • ループ2:隣人の隣人が肯定的なキャンディーを持っているかどうかを調べ、キャンディーの数がゼロになるまでネガティブキャンディーでそれを与え、2(合計に与えられるキャンディーの数)を加えます。

  • など。

私の解決策の複雑さはTLEを引き起こしています。複雑さを減らすために私は何ができますか?

+1

使用しているオンラインジャッジを参照してください。 – Alexander

+0

nの最大値は10000、制限時間は3秒です。これは私の大学のインタビューのストリップのコンプをコーディングしていた。私はそれを解決することができませんでしたが、答えが何であるか知りたいと思っていました。 – kanz

+6

ネガティブキャンディー?その貧しい子供たち! –

答えて

5

詳細をループする必要はありません。それぞれの場所にあるキャンディの数をX1、X2、X3、X4と書く。 X1が左からk個のキャンディーを受け取ったとします(つまり、X4の場合)。その後、X1 + kキャンディーがあるので、これをその右に渡す必要があります。それから、X2はX1 + X2 + kのキャンディを持っているので、右にこれを渡す必要があります。 X3はX1 + X2 + X3 + kキャンディーを持つので、X4にこれを渡す必要があります。私たちはX4がk個のキャンディーを通過したことを知っており、これはチェックします(X1 + X2 + X3 + X4 = 0で、それがなければ解はありません)。

これは| k | + | X1 + k | + | X1 + X2 + k | + | X1 + X2 + X3 + k |私たちがkを推測すれば、私たちはいくつのステップを取るべきかを知っています。 kの最高の価値は何ですか? kを増加させると、+ ve項X1 + X2 + ... kがさらにあれば総和が増加し、-ve項が増えると減少する。したがって、kの最良の値は、| k |、| X1 + k |の半分がちょうどveであり、ちょうど半分のものです。これが当てはまらない場合、kを増減することができますより良いもの - 選択するkの値は0、X1、X1 + X2、X1 + X2 + X3の中央値です。

私はあなたの例のn = 4の場合についてこれを述べましたが、これから一般的なnの答えを試すことができれば幸いです。

+0

Arrgh!私はこの15分を解決して(まったく同じアプローチで)、今のところしかログインできませんでした。 +1。よくやった:-) – Knoothe

+0

右から左への転送を表す、kが負である可能性があることを理解した後、クリックした。それから、子供の左から子どもに移されたキャンディーがいくつあるかを知っていると仮定すると、これから始まるキャンディーの数と子供の数は、 0自身である。私たちは理論的には、すべての正のキャンディー数の合計(キャンディーを「生き生きとさせる」)を上回るようにkを推測することはできますが、そのような試行錯誤は決して最適ではないため選択されません。ニース! –

1

ここで適用されるメタアプローチは、ポーリングしてイベントベースにするアルゴリズムを採用することです。私はどういう意味ですか?

贈与者(菓子が> 0の子供)と募集人(飴の子供)を含む循環リンクリストを維持します。贈与者と入札者との間の距離をキーとする各隣接者(円ではなくリスト内)の贈答者ペアのエントリを含む優先度キューも維持する。

ここで、距離を1ずつ増やすのではなく、プライオリティキューを使用して、次に発生する興味深いものを把握してください。贈与者のペアが解決されるたびに、一方または両方の子供がリストから脱落するため、O(1)の簿記とキューの挿入が必要になります。

2

mcdowellaのアイデアを取って、私の言葉にそれを置くことは、(それはそれを理解するために私にしばらく時間がかかったので、このトピックに関するいくつかのhandwringingためhereを参照)、以下のように見えます。キー洞察力があります:あなたが負のお菓子を所有することができます

  • 同じように、あなたは基本的に反対方向に(正)お菓子を渡して一方向に負のお菓子を渡す負のお菓子だけでなく
  • を渡すことができ
  • 何であれ子供が持つキャンデーの響き、誰もがゼロになるだろう。

これは次のように実装されています。開始する任意の子を選んでください(次の図の子A、4ではなく5人の子供がいる)、任意の方向を選択します(この例では反時計回り) 、そして通過を開始する。すべての子供はゼロになるためにすべてのキャンディー(正または負)を取り除かなければなりません。だから子供Aは-2キャンディーを持っているので、それを子Bに渡します。その子Bに-5キャンディーがあるので、それを子Cに渡します。今度は子供Cが-4キャンディーを持ってDに渡します。これは2番目の図であり、すべてのキャンディーは13回の移動でゼロになります。

enter image description here

SENTER図は最適ではありません。中心線図を通過したすべてのキャンディーは負(E-> Aパスを除く)であり、で最初のパスから加算または減算することができます。A-> Bパスが-2ではなく+5だった場合、すべてのパスは7だけインクリメントされ、E-> Aパスは0ではなく7となり、最後にはまだキャンディーがありません。そこで、すべてのパスの絶対値の合計が最小になるように、すべてのパスを調整できる数値を求めます。最後の図では、すべてのパスに+2を追加すると、すべてのパスの絶対値の合計が7であることがわかります。例として、+3を追加すると、合計が大きくなります。したがって、すべてのパスの絶対値の合計を最小にするすべてのパスに定数を追加しようとします。

P.S.誰かがのmcdowellaの私の再通知がここにあるべきではないと思うなら、私は削除して喜んでします。

+1

それは良い説明です:)私はmcdowellaの答えにも "反対の方向に渡されている"ネガティブなk ==キャンディーをクリックするにはしばらくかかりました。 –

+0

ありがとう!ええ、私はちょうどこれを投稿するかどうか分からなかった:私はmcdowellaの知的信用を盗むことを望んでいないが、アイデアがきちんとしていると思った、そしてそれを説明する別の方法があったかもしれない。 – angelatlarge

+0

あなたは明らかに最初に彼/彼女の信用権を与えました - それは誰もが私が推測する必要があることです!より多くの説明==良い:) –

関連する問題