[タイトル]説明:
ファーマージョンが通知され、彼の牛の一つはエスケープ!そこで彼は、鳥の牛が再び戻ってくるや否や、一度に開始することを決めました。
彼らは、数直線上に立ちました。Nジョン、代わりにK牛。;およびテレポートは彼が1秒でxから消えることができます、の2倍で、ジョンはxでからの第2のx + LまたはXLごとに歩いて行くように:ジョン、移動歩くとテレポートする2つの方法があります表示されます。しかし、それだけで悲劇的にその状況が、そこに動か立ってどのように悪い発見していなかった、牛を逃れるでしょう。
まあ、ジョンはそれが牛のホールドを取るどのくらい?
[説明入力:
2つだけの整数NとK.
[出力]説明:
最短時間
[]サンプル入力:
517
[]出力サンプル:
4
[時間制限、およびデータの説明の範囲:
時間:1秒容量:128M
O <= N <= 100000
O <= K <= 100000
この質問は、標準的なBFSトピックではなく、クロスボーダーのと同様に、このポイントに気をつけて検索されません。
#include <cstdioを> する#include <iostreamの> する#include <アルゴリズム> の#include <CStringの> する#include <cstdlib> の#include <cmath> 使用して 名前空間STD。 INT X、Y、B。 int型 S [ 100006 ]。 INT Q [ 100006 ]。 INT メイン(){ // freopenは( "17.in"、 "R"、STDIN)。 // freopenは( "17.out"、 "W"、STDOUT)。 scanf関数(" %D%dの"、&、&B)。 もし(Bの== 0){COUT <<。リターン 0; } のmemset(S、 - 1、はsizeof (S))。 int型のフロント= 0 ; INTの後= 0 。 S [A] = 0 ; Q [++リア] = 。 一方、(S [B] == - 1 &&フロント=!後){ X = Q [フロント++]。Y = X- 1 。 もし(Y> 0 && Y <= 100000 && S [Y] == - 1 ){ S [Y] = sで[X] + 1 。 Q [後部 ++] = Y。 } Y = X + 1 。 もし(Y> 0 && Y <= 100000 && S [Y] == - 1 ){ S [Y] = sで[X] + 1 。 Q [後部 ++] = Y。 } 、Y = X * 2 。 もし(Y> 0 && Y <= 100000 && S [Y] == - 1 ){ S [Y] = sで[X] + 1 。 Q [後部 ++] = Y。 } } COUT << S [B]。 リターン 0 ; }