プライオリティキュー
プライオリティキュー を使って、下記の問題を解いてみます。
[問題]
車で 距離L の道を移動します。車にはもともとガソリンが P はいっています。 この車では距離1走るとガソリンが1消費されます。ガソリンが0になると車は停止し移動は失敗します。 途中には N箇所 のガソリンスタンドがあり、各ガソリンスタンドは道のスタート地点からそれぞれ 距離Ai の地点にあり Bi だけガソリンを補給することができます。 車の燃料タンクにはいくらでもガソリンを補給できます。 車は最後まで移動できるでしょうか。最後まで移動できる場合は 最小の補給回数 を、移動できない場合は -1 を出力してください。
[条件]
・ガソリンスタンド数Nは、1以上10000以下です。 ・目的とする移動距離Lと初期ガソリン量は、1以上1000000以下です。 ・スタート地点から各ガソリンスタンドまでの距離Aiは、1以上目的とする移動距離L以下です。 ・各ガソリンスタンドで補給できるガソリン量Biは、1以上100以下です。
[解き方]
車で走るときには、ガソリンスタンドの場所に来た時にしかガソリンを補給できません。 しかし ガソリンスタンドの場所に来た時、それ以降いつでも一度だけガソリンを補給できる権利を手に入れる というように考えることもできます。 後で補給したくなった時に、すでに通過したガソリンスタンドで補給していたことにします。 できるだけ少ない回数の補給にしたいので、燃料が0になるまで走ってから補給をすることにします。 燃料が0になったときに使うべきガソリンスタンド(ガソリン量)は、明らかに最も大きいガソリン量です。 これを効率的に行うために、大きい数字から順に取り出せる プライオリティキュー を使います。 通常のリスト型から max関数 で一番補給量の多いものを取得し、取得したら remove関数 でその要素を削除することで プライオリティキュー の機能を実現します。
[Google Colaboratory]
1 | #------------入力例1----------------- |
[実行結果]
2
1つめのと2つ目のガソリンスタンドでガソリンを補充すると目的の距離まで走ることができ、かつ最小の補給回数なので 2 が解となります。