(贪心)を記入する記入したりしないようにPAT-A1033またはcodeup 2031题解

 記入する記入するかしないかを

制限時間:1秒の   メモリ制限:32メガバイト

タイトル説明

利用できる高速道路では、他の都市への杭州から車を運転するのは簡単です。車のタンク容量が限られているので、しかし、我々は随時途中でガソリンスタンドを見つける必要があります。別のガソリンスタンドは、異なる価格を与える可能性があります。あなたは慎重に行くための最も安いルートを設計することが求められます。

エントリー

各入力ファイルには、1つのテストケースが含まれています。各場合について、最初の行は、4つの正数含ま:C maxの  (<= 100)、タンクの最大容量を、D(<= 30000)、杭州と目的地の都市の間の距離。Dの平均  (<= 20)、車を実行することができ、単位ガスあたりの平均距離。及びN(<= 500)、ガソリンスタンドの合計数。次いで、Nライン各々は非負数のペアが含まれ、従う:P I、単位ガス価格、およびD I  (<= D)、このステーションと杭州の間の距離、I = 1、... N。行のすべての数字は、スペースで区切られます。

輸出

各テストケースの場合は、小数点以下2桁までの正確なラインで最も安い価格を、印刷します。タンクが最初に空であることが想定されます。それは目的地に到達することは不可能である場合は、印刷「最大移動距離= X」Xは車可能な最大距離で小数点以下2桁まで正確に、実行することができます。

サンプル入力1

59 525 19 2 
3.00 314 
3.00 0

サンプル出力1

82.89

サンプル入力2

50 1300 12 8
6.00 1250
7.00 600
7.00 150
7.10 0
7.20 200
7.50 400
7.30 1000
6.85 300

サンプル出力2

749.17

サンプル入力3

50 1300 12 2
7.10 0
7.00 600

サンプル出力3

The maximum travel distance = 1200.00

  実を言うと、私はこの質問に無知強制表情を見て始めた、貪欲は非常に少し書いた、このテーマは、任意のアイデアを持っていませんでした。私は価格行でシーケンスを開始したい、そしてそれは、それからの距離に応じてソートされていないようだが、考えられていたものを期待していなかったことがわかりました。

  明確なアイデアについて何度もテストケースの問題解決に続いて、再度テストを知っていると題されすぎて貪欲と言われています。  

  最初は通常の読み出しで、いっぱいの状態に行くことができます、あなたが直接実行することはできません、それなしで実行し、ステーションと、前のステーションとの間の距離を横断していない、ガソリンスタンド0位置があるか否かを判断します出力。最後の重要なポイント、ガソリンスタンドとトップアップは、フィニッシュラインに続くことはできませんが、私はまだ最後まで行くことができません。

  トラバース私たちが知ってOKです、車は最後まで行くことができますが、最小のそれをお金をカウントする方法?

  私たちは、それが特定の局Aを(スタート駅0の位置に到達することです)、私たちは石油の数を増やすことができます知らないが、我々は油を満たした場合でも、最大の範囲にのみ距離= Cを実行することを知っているに達すると想定最大の * D AVG私たちは現在の局からトラバースすることができ、最大範囲(距離及び宛先を超えない位置)内の全ての局は、いくつかの状況があります;(2)複数存在する1、それは今よりも安いガソリンスタンドがありますそれよりも安いガソリンスタンドは今、3、それは今よりも安く全くガソリンスタンド; 4は、上記を横断に起因するいかなるガスステーションは(、我々は特定のガソリンスタンドにあり、現時点では知りませんが、それ以外の場合は到達できない原因となります、最後のストップであります先が、私たちは矛盾に到達するために通過し、それは最後の1でなければならないかどうかを上記); 5、それは今よりも安いの範囲ではなく最後までノーガソリンスタンド。

  1の場合は、駅に到達するために貪欲なだけ追加燃料により、原則的に知ることは簡単ですが、2の場合には、我々はその1つの内部にこれらの最小燃料を補給するために追加すべきではありませんが、最初の給油に追加する必要がありますそれはそれはガソリンスタンドaで今よりも安いですが、これはなぜですか?あなたはBが油を使い果たしステーションの後よりも、この最初の以下に給油所を開いた場合、燃料がBに追加されているので、すぐ+遠ざけるために、次のステーションB、Bレンジ位置で始まります位置Bは、その後、確実からCにも複数の処理と同様であり、安価な燃料第一のガスステーションB Cよりも小さくなってきています。(ケース2は、ケース1の計算方法に適用されます)

  3のケースでは、我々は唯一に追加することができ、オイルで満たされた、彼は私たちの前の位置よりも高価だったものの、ガソリンスタンドDの最小原油価格以内の範囲に、開いたが、我々は、我々を給油せずに実行するので、Dに到着することはできません駅に到着したときにDレンジの開始から全てのステーションを介して、Dです。彼らは、Aは、あなたがしたい理由として、その最大範囲に到達し、他のステーションにオイルを使用しますが、Aよりも高価なので、我々はオイルAを使用しようとするからで記入していないので、なぜ、ここで注意を埋める必要がありますDの給油は、給油せず、その後、あなたが最大の範囲を開くことができませんでしたので、宛先に到達しません。

  4の場合には、限り、我々は先サイトへのボックス内に残ってどのくらいの油とどのくらいの油に最後まで駅を判断するようにお金を費やすように計算されます。

  ケース5では、私たちはすることができ、この最後まで駅から直接開きました。(4の場合のように計算されます)

  最後の駅でこの範囲に達しているにかかわらず、サイトの駅Bの最初のステーションAよりも安い価、または最も高価なの範囲内(油に駅Bが0である)が、より更により、説明でステーションD局高価で、残留油がこのステーションE.このガソリンスタンド(BまたはD)の範囲内で次回に到達するのに十分ではない第一のガスステーションよりも安価です それは確かに、その後、残りの0 Bでない場合ので。Dである場合、確かに範囲の開始点として残って通過することができない、確かにDレンジでAの範囲内、または3のような第一のガスステーションEより安価次DはDに選択しないであろう(安価AとE Dよりも高価の範囲の場合よりも、我々は状況がEに3にすることなくDになります続く)ので、ガソリンスタンドはこのサイト上にある必要がありますよりも、次の駅の単価が安いです達し、さあ。

 ACコード:

 

書式#include <stdio.hに> 
する#include <アルゴリズム> 
書式#include <cmath> 
名前空間stdを使用。
#define EPS 1E-8 
構造体ノード
{ 
	ダブルP; //单价
	ダブルD; //位置
} dnode [505]。
BOOL CMP(ノード、ノードB)
{ 
	場合(!広告= BD)
		のリターン広告<BD。
	それ以外の
		戻りAP <BP。
} 
INTメイン(ボイド)
{ 
	ダブルC、D、DAVG。
	int型のn; 
	(scanf関数( "%LF%LF%LF%のD"、&C、&D、&DAVG、&N)== 4)しながら
	{ 
		ため(= 0のI int型、iがn <; iは++)
		{ 
			scanf関数( "%のLFの%のLF" 、&​​dnode [I] .P&dnode [I] .D)。
		}  
		ソート(dnode、dnode + N、CMP)。
		ブールフラグ= TRUE。
		IF(ABS(dnode [0] 2.D)<EPS)
		{ 
			ため(INT I = 1; I <N-; I ++)
			{ 
				IF(C * DAVG <dnode [I] 2.D - dnode [I - 1] 2.D )//ないこともあれば、次の塗りつぶしに
				{ 
					のprintf( "%.2f = \ N-最大の走行距離"、dnode [I - 1。] 2.D DAVG + C *); 
					=フラグにfalseに; //もはや計算に必要な
					ブレーク; 
				} 
			} 
			IF(フラグにDAVG && * C <D - dnode [N - 1] 2.D)//局との間ではなく、最後のストップの宛先に到達できる場合
			、{ 
				最大のprintf(」旅行\ N- .2f距離=%」、dnode [N - 1] 2.D DAVG + C *); 
				falseに旗に=; //計算された必要はありません
			} 
		} 
		他//何のガソリンスタンドの場所0 
		{  
			のprintf(「最大の走行距離= 0.00 \ N-を」);
			falseに旗で=しません; //計算された必要はありません
		} 
		ダブルnowp dnode = [0] .P、nowd dnode = [0] 2.D、月= 0.0、nowv = 0; // nowpサイトの一価、nowdサイト発信局0からの距離
		// nowvサイト残りの油、月マネー
		。INT 1 = I; 
		ダブル距離= C * DAVG; //先頭に行くことができます駅から最も遠い距離を埋め、これは同等です局の最大範囲
		INTミニ;最小一価の記録位置場合// 3が発生する
		IF(フラグに)
		{ 
			(フラグに)、一方
			{ 
				// 3最小記録単位の価格が表示される場合、ダブルMINP = 1E9は
				ブールb_f = FALSE ; //かどうか3 
				// 4,5判断の場合は、最後のステーションに(ステーションは最後のn個のためだっただろう- 1、私++の前に蚊帳の外になりますので、私== n)はお金の末尾に(でも最後に、また、立って右端)
				// 4,5いずれの場合iは== Nサイクルの外であるため、後者は、ここに到着するように、
				IF(I == N + NOWD &&距離- D> -EPS)
				{ 
					月+ =((D - nowd)/ DAVG - nowv)* nowp; // 元の残留油価を減算することによって油の最後端局*
					フラグ= falseに; 
				} 
				{
					ながら(私は<N - &&距離- (dnode [I] 2.D - NOWD)> -EPS)を//ステーションが横断し、ステーションの範囲内にない場合
					、{ 
						IF(dnode [I] .P <nowp)//直接Bに、ステーションのステーションBより一価小さいがある場合
						{ 
							月+ =((dnode [I] 2.D - NOWD)/ DAVG - nowv)* nowp; //からオープンB過ごすにオイルマネー
							nowv = 0; //油膜上(ケース2に相当)
							nowp = dnode [I] .P; //更新部
							nowd = dnode [I] .D; // 更新位置
							iが++; /ステーションBの範囲内の最初のステーションへ/私点
							b_f = TRUE; //ない場合3 
							BREAK; 
						} 
						そうでなければ
						{ 
							(dnode [I] .P <MINPは)// 3は、最小値を見つけることができる場合には、もし後ケース3はb_f trueに設定置かれないことが分かっ
							{ 
								; MINP = dnode [I] .P 
								ミニ= Iであり; 
							} 
						} 
						私は++します; 
					}
					(!iは<N && b_f場合 )// ケース3の一部と4,5のケースではありません
					{ 
						1 I =ミニ+;次// iは範囲ポイント内の最初のステーション
						月+ =(Cを- nowv)* nowp; //お金更新
						nowp = MINPを; //更新価格
						によるサイトへ//更新油は(埋めるために、そのスタートC); = Cがnowv 
						nowv - =(dnode [ミニ] .D - nowd)/ DAVG; //満たす残りの次に開放
						nowd = dnode [ミニ] .D; // 更新場所
					} 
				} 
			} 
			のprintf( "2LF%\ N-"、月); 
		} 
	} 
	リターン0; 
}
				

 

  

 

 

おすすめ

転載: www.cnblogs.com/jacobfun/p/11313903.html