364 HDU 1548]奇妙なエレベーター
★入力ファイル:lift.in
出力ファイル:lift.out
の単純な比較
制限時間:1秒メモリ制限:128メガバイト
[問題の説明]
ああ、ある日、私は非常に奇妙なエレベーターについての夢を見ました。ビルの各フロアは、エレベータ、床及びIを停止することができる(1 <= iが= Nを<)上の数のKi(0 <=のKi <= N)を有しています。エレベーターだけで4つのボタン:オン、オフ、アップ、ダウン。上層と下層現在階にその数に等しいです。あなたが要件を満たすことができない場合はもちろん、対応するボタンが失敗します。例えば:33125が一階からのKi(K1 = 3、K2 = 3、...)を表します。何-2床が存在しないため一階に、プレス4階の「上」は、「下」によれば無効です。だから、Bハウスに床Yaoanから、少なくともいくつかのボタンがありますか?
[入力形式]
2行は入力ファイルがあり、スペースで区切られた3つの正の整数を有する第一の挙動はN、A、B(1≤N≤200、1≤A、B≤N)、Nのスペースで分離された第2ラインを表しますKiを表す正の整数。
[出力形式]
到達していない場合、出力ファイル、即ち、キーストロークの最小数の唯一の行は、出力は-1。
[サンプル入力]
5 1 5 3 3 1 2 5
[サンプル出力]
3
実際にQAQとの最短経路問題の広範な検索を行うにQAQ感があまりにも退屈で
、実際に最も効率的な時間や偉大なアヒルの短絡(私はまだダイクストラ使用)
のm *の関数logmの
最高の状態でここメートルを400〜えっと、この偉大なスピード
ここでの考え方は、それぞれの層までの現在の層の床層の出発点ともあり、kのk個の層が接続されてダウンして
、その後下落しているものを木材で行くことに決定しなければならない、または直接オーバーヘッドΣを飛ぶ(⊙▽⊙」
を通じて、実際秒という非常に単純な問題である
私が掲示何に次のトレーニングの練習テンプレートの友人である場合)(通常のバーコードではありません
書式#include <cstdioを>
する#include <iostreamの>
の#include <アルゴリズム>
書式#include <ベクトル>
の#include <cmath>
の#include <キュー>
の#define PAペア<int型、int型>
の#define MAXN 205
の#define INF 0x3f3f3f3f
使用して 名前空間はstdを;
INT N、A、B。
ベクター < INT > [MAXN] V。
int型; DIS [MAXN]、VIS [MAXN]
PRIORITY_QUEUE <PA、ベクトル<PA>、大きな<PA>> Q。
ボイドダイクストラ()
{
用(INT I = 0; I <= MAXN; iは++ )
DIS [I] = INF。
DIS [A] = 0 ;
q.push(make_pair(0 、A))。
一方、(!q.empty())
{
int型のx = q.top()は、第2。
q.pop();
もし(VIS [X])
続けます。
VIS [X] = 1 。
以下のために(int型 i = 0 ; iはV <[X] .size(); iは++ )
{
int型、Y = V [X] [I];
もし(DIS [Y]> DIS [X] + 1 )
{
DIS [Y] = DIS [X] + 1 。
q.push(make_pair(DIS [Y]、Y))。
}
}
}
}
int型のmain()
{
freopenは(" lift.in "、" R " 、STDIN)。
freopenは(" lift.out "、" W " 、STDOUT)。
scanf関数(" %D%D%D "、&N、&A、&B);
以下のために(int型 I = 1 = iが<Nを;
scanf関数(" %のD "、&K)。
もし(I + K <= N)
、V [i]は.push_back(I + K)。
もし(IK> 0 )
V [i]は.push_back(IK )。
}
ダイクストラ()。もし(DIS [B] == INF)
のprintf(" -1 " )。
他
のprintf(" %dの" 、DIS [B])。
リターン 0 ;
}
♪(^∇^ *)給油ああ~~~