(25点)を記入する記入したりしないように[PAT]クラス1033(貪欲、あなたは簡単な解決策を作ることができる思考)

質問の意味:

四つガソリンのリットル当たりの正入力C、DIS、D、N(C <= 100、DIS <= 50000、D <= 20、N <= 500)、タンク容量を表す、ターゲット杭州市までの距離を、でき距離は、ガソリンスタンドの数を旅しました。次の入力データN行は、ガソリンスタンドのリットルを含む各行は、ガソリンスタンドの価格、杭州からの距離を表す小数。最小燃料への杭州の出力がない場合は杭州からの出力最も遠いの言葉に、街を要しました。

アイデア:

ガソリンスタンド、ガソリンスタンドは、範囲を移動できる場合、私はタンクを埋めるI〜Jよりも安いガソリンスタンドの価格は、それから私jの位置マイナス費用(燃料タンクとしての位置を取るときのタンクを埋めるためにあらゆる時間ステーションiとjの間の距離を引い塗りの最大移動範囲)ガソリンのこの旅に必要な消費を加えた油のボックス全体のコストがかかり、ない旅の最大の範囲内で私給油より安い場合ガス局kを見つけるためのステーションは、その後、コストが位置k I位置プラスステーションiとkの間を消費する必要性から、ガソリンのコストこの旅に費やされ、最も安いの範囲内です。最大距離xを埋めるためにガソリンスタンドの中央には、対象都市を超えた後、それはガソリンスタンドのXマイナスオイルフィニッシュ市のオイル目標距離を超えて過ごすには、このボックスの現在のコストに等しいANSを更新作り、ガソリンスタンドの価格Xの場合がある場合安いガソリンスタンドは、直接壊れていない場合は、すでに最適なソリューションであり、そして原油価格の後に戻ってあなたのガソリンスタンドに給油後の直接の目標価格のx街を越えて行くだろう、見続けています。核となるアイデアは、問題に対する別の解決策は、唯一最大DIS 30000に基づいて、貪欲であるキロで最も安い燃料価格のキロメートル毎に算出、ハイからガソリンスタンドの低い石油価格に分類することができ、バックからフロントにスイープ座標ブレークポイント(キロキロ無燃料、辺ぴな所前後で、直流出力位置)がある場合は、ブレークポイントは、各キロを追加するために必要な1〜DIS油できなくなります答えは、Iこの場所は自由、それらをより明確なコードを処理し、あまり貪欲考慮する必要があり、その後、全体を添付だと思います。

トリック:

同じ座標データを有する複数のステーションを含む第一のテストポイント。

第二のテストポイントデータがないガソリンスタンドの開始点を含みます。

最初の4つのテストポイントは、多かれ少なかれ市内最大のメールの量と目標都市近いガソリンスタンド油より高価からの距離でターゲットガス局からの距離が含まれています。

最初のテストの点は0,6は以下の目標都市近いガソリンスタンド油より高価からのメールの最大のボリュームとの距離と同等のターゲット都市ガス・ステーションからのより多くの距離を持っている含まれています。

私は、フレンドカードのデータポイント2または4(指定されたフォーカス)を助けることを望んで、上記データエラーコードから推測します。

コード:

#define HAVE_STRUCT_TIMESPEC
する#include <ビット/ STDC ++ H>
使用して名前空間std。
ダブルC、DIS、D;
int型のn;
対<二重、二重> [507]。
二重和[507]。
メインINT(){
CIN >> C >> DIS >> D >> N。
(I 1 = int型++ I; iが<= n)のため
CIN >> [I] .second >> [i]が1次回。
ソート(+ 1、A + 1個の+ N)。
IF([1] 1次回> 0){
COUT << "最大移動距離= 0.00"。
0を返します。
}
和[1] = C * [1] .second。
ダブルANS = 2E18;
(I = 1をint型、iが<= N; ++ i)のため、{
ダブルMN = 2E18。
int型POS = 0;
用(int型J = I + 1、J <= N; ++ J){
IF([J] 1次回- [I] 1次回> C * D)
ブレーク。
([J]もし.second <[I]。
第二){ POS = J。
ブレーク;
}
IF([J] .second <MN){
MN = [J] .second。
POS = J;
}
}
(POS && iがn <!){もし
COUT << "最大移動距離="。
printf( "%2F"、[I] 1次回+ C * D)。
0を返します。
}
場合([i]が1次回+ C * D> = DIS){
ANS =分(ANS、和[1] - ([I] 1次回+ C * D-DIS)/ D * [i]と.second);
INTフラグ= 0。
(; J <= N ++ J int型J = I + 1)のための
IF([J] .second <[I] .second)
フラグ= 1。
(!フラグ)であれば
ブレーク。
}
([POS] .second <[I] .second)もし
和[POS] =和[1] - (C *とのD-([POS] 1次回- [I] 1次回))/ D * [I] .second + [POS] .second * C。

和[POS] =和[I] +([POS] 1次回- [I] 1次回)/ D * [POS] .second。
(私は<場合

// coutの<< I << " "<< POS <<" "<<合計[POS] <<" "<< ANS <<" \ nを";
}
IF([N] 1次回+ C * D <DIS){
COUT << "最大移動距離="。
printf( "%2F"、[n]は1次回+ C * D)。
}

のprintf( "%2F"、ANS)。
0を返します。
}

おすすめ

転載: www.cnblogs.com/ldudxy/p/11515967.html