ブルーブリッジカップタイトルの練習(旅行の予算)

アルゴリズムVIP旅行の予算トレーニング

元の質問へのリンク:旅行の予算

タイトルは説明
旅行者は、(起動タンクが空であると仮定される)別の都市に1つの都市から最小コストのために車を運転したいと考えています。与えられた二つの都市の間の距離(リットル)D1、車の燃料タンク容量Cに、ガソリン1リットル当たりの距離D2は、出発点Pと経路数N(Nはゼロであり得る)に沿ってガソリン充填ステーションのリットル当たりの価格を移動することができます、距離ジリットルパイ当たりガソリンの価格の出発点からガソリンスタンドiは(iは1,2 =、... N )。結果は、2つの小数点以下の桁数に四捨五入されています。あなたは目的地に到達できない場合は、出力が「いいえソリューション」。
入力
最初の行4の実D1、C、D2、PとNの整数非負;
次にN行、各行二つの実ディ、パイ。
出力
あなたは目的地に到達することができた場合は、(2桁まで四捨五入)実数の出力は、最小コストを表し、(引用符なし)それ以外の場合は、出力「いいえソリューション」。
サンプル入力
275.6 11.9 27.4 2.8 2
102.0 2.9
220.0 2.2
サンプル出力
26.95

考えます

このタイトルが利用可能に貪欲アルゴリズムであり、
最も適したガソリンスタンドは、結果を給油識別することによって、
私は主な問題は、最長走行距離車、オイルメイクトレードオフの価格を考慮する必要だと思う、それはある
ガソリンスタンドの現在の価格はガソリンスタンドに従うよりもさらに低いですしかし、走行距離制限の価格に、我々は、低価格のオイルがあなたのガソリンスタンドを埋めるために時期を決定するために必要な燃料を補給しなければならなかったため、

#include<iostream>
#include<algorithm>
#include<iomanip>
using namespace std;

int main()
{
	float D1, C, D2, P, N;
	float Ds[1000][2];
	float minMoney = 0;
	cin >> D1 >> C >> D2 >> P >> N;
	Ds[0][0] = 0;
	Ds[0][1] = P;
	int i;
	for (i = 1; i <= N; i++)
	{
		cin >> Ds[i][0] >> Ds[i][1];
	}
	Ds[i][0] = D1;
	Ds[i][1] = 0;

	float NowP = P;
	float NowD = 0;
	int Flag_N = 0;
	bool isAble = true;


	for (int i = 1; i <= N + 1; i++)
	{
		if (Ds[i][0] - Ds[i-1][0] > (C * D2))
		{
			cout << "No Solution";
			isAble = false;
			break;
		}
		if (Ds[i][0] - Ds[Flag_N][0] > ((C * D2)))
		{
			NowD = Ds[Flag_N][0] + (C * D2);
			minMoney += C * NowP;
			NowP = Ds[i - 1][1];
			Flag_N = i - 1;
			if (NowP > Ds[i][1])
			{
				minMoney += ((Ds[i][0] - NowD) / D2) * NowP;
				NowD = Ds[i][0];
				NowP = Ds[i][1];
				Flag_N = i;
			}
		}
		else if(NowP > Ds[i][1])
		{
			minMoney += ((Ds[i][0] - NowD) / D2) * NowP;
			NowD = Ds[i][0];
			NowP = Ds[i][1];
			Flag_N = i;
		}
	}
	if (isAble)
	{
		cout << fixed << setprecision(2) << minMoney;
	}
	return 0;
}

公開された89元の記事 ウォンの賞賛6 ビュー2693

おすすめ

転載: blog.csdn.net/Z_122113/article/details/104424474