タイトル説明
旅行者は、(出発タンクが空であると仮定される)別の都市への1つの都市から最小コストのために車を運転したいと考えています。二つの都市間の距離を設定しD1D1 D 1、車両タンク容量CCを移動することができるガソリンのリットル当たり(リットル)C距離D2D2 D 2、ガソリン開始点のリットル当たりPPのPに沿って充填ステーションの数NN N(NN Nがゼロであってもよい)、ガソリンスタンドII Iの出発点からの距離ディディD I、ガソリン当たりのリットルピピP I(I = 1,2、...、ニッケル= 1,2、...、NのI = 1 、2 、... 、N)。結果は、小数点以下に丸められます。あなたは目的地に到達できない場合は、出力が「いいえソリューションありません」。
入力形式
最初の行、D1D1 D 1、CCのC、D2D2 D 2、PP P、NN N.
そして、そこにNN N行。
I + 1I。1 + iが+ 。1行、2つの数値を、始点からiはステーション距離ガソリンディディD i及びリットル価格ピピP Iを。
出力フォーマット
必要最低限のコストが、結果は小数点第3位を四捨五入。あなたは目的地に到達できない場合は、出力が「いいえソリューションありません」。
サンプル入力と出力
入力#1
275.6 11.9 27.4 2.8 2
102.0 2.9
220.0 2.2
出力#1
26.95
説明/ヒント
N ≤ 。6、残りの数字≤500
アイデア:
これは議論に注意を払う、道路シミュレーションの質問です。
コード:
#include <cstdioを> する#include <iostreamの> する#include <cstdlib> の#include <アルゴリズム> の#define N 100000 名前空間stdを使用。 ダブルD1、C、D2、P、MAXX、MO、lenの。 int型のn; 構造体ノード{ ダブルCOS、DIS。 } E [N]。 ブールCMP(ノードA、ノードB) { a.dis <b.disを返します。 } INT移動(今INT) { int型缶= 99999。 INT F = E [今] .DIS。 (私は++; I [i]は.DIS-F <= MAXX Eを<= N && I =今+ 1 INT)のために { (.cos <E [今] .cos E [I])であれば { MO + =(E [I ] .DIS-F-LEN)/ D2の*のE [今] .cos。 LEN = 0; 私は返します。 } (99999 || E [i]は.cos <E [缶] .cosを==ことができる)可能であれば= Iであり; IF(D1-E [今] <= MAXX .DIS) { MO + =(D1-E [今] .DIS-LEN)を/ D2 * E [今] .cosと、 9999を返します。 } (99999 ==ことができる)場合 、{ プット( "ノーソリューション"); -1を返します。 } 他 { MO + = C * E [今] .cos。 LEN + =(MAXX-eは[缶]は+ Fを.DIS)。 返すことができます。 } } int型のmain() { scanf関数( "%LF%LF%LF%LF%のD"、&D1、&C、&D2、&P&N) 以下のために(INT i = 1; iが++; iが<= N) { scanf関数( "%のLFの%のLF"、&E [i]は.DIS、&E [I] .cos)を、 } E [0] .DIS = 0。 E [0] .cos = P。 ソート(E + 1、E + N + 1、CMP)。 MAXX = C * D2。 INTのK = 0、T。 実行{ T =ムーブ(K)。 (Tの== - 1)であれば0を返します。 }一方、(T = 9999!)。 printf( "%2F。"、MO); 0を返します。 }