83 旅行家的预算

83 旅行家的预算

作者: Turbo时间限制: 1S章节: 其它

问题描述 :

  一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离D1、汽车油箱的容量C(以升为单位)、每升汽油能行驶的距离D2、出发点每升汽油价格P和沿途油站数N(N可以为零),油站i离出发点的距离Di、每升汽油价格Pi(i=1,2,……N)。计算结果四舍五入至小数点后两位。如果无法到达目的地,则输出“No Solution”。

输入说明 :

  第一行为4个实数D1、C、D2、P与一个非负整数N;
  接下来N行,每行两个实数Di、Pi。

输出说明 :

  如果可以到达目的地,输出一个实数(四舍五入至小数点后两位),表示最小费用;否则输出“No Solution”(不含引号)。

输入范例 :
275.6 11.9 27.4 2.8 2
102.0 2.9
220.0 2.2
输出范例 :
26.95

#include <iostream>
#include <cstdio>
using namespace std;
#define MAX 1001

int main()
{
	int N;
	double D1, C, D2, P;
	cin >> D1 >> C >> D2 >> P;
	cin >> N;          //总距离D1,总容量C,每升油可走距离 D2,初始油价 P, 加油站N个

	double distance[MAX];                    //加油站i到起点的距离
	double price[MAX];                          //油的价格

	distance[0] = 0; price[0] = P;                      //加上起点的数据 距离为0 油价为P
	distance[N + 1] = D1; price[N + 1] = 0;     //终点的数据 距离为D1 油价为0

	double total = 0;                 //费用
	double surplus = 0;             //到达第i个加油站剩余油量
	double maxDis = C*D2;       //加满油行驶最大距离
	bool flag = true;                 //是否能达到终点

	for (int i = 1; i <= N; i++)
	{
		cin >> distance[i] >> price[i];
		if (distance[i] - distance[i - 1] > maxDis)//如果有一段距离超过最大可行程,flag为假
			flag = false;
	}

	if (flag == false)
	{
		cout << "No Solution" << endl;
		return 0;
	}

	/* 
	         i:当前加油站的编号
			 j:下一个比自己便宜的加油站编号
	*/
	for (int i = 0, j; i <= N; i = j) //到达j后 将i=j 即当前加油站的编号   
	{
		for (j = i + 1; j <= N+1; j++)//从i的下一个加油站开始 找比当前加油站便宜的加油站 即price[j]<=prixe[i]
		{
			if (distance[j] - distance[i] > maxDis) //如果不能行使到比i便宜的加油站
			{
				j--;                                            //先行使到加满油可以达到的加油站
				break;
			}
			if (price[j] <= price[i])//如果找到比i便宜的加油站 跳出当前循环
				break;
		}
		if (price[j] <= price[i])// 1.break
		{
			total += ((distance[j] - distance[i]) / D2 - surplus)*price[i];
			surplus = 0;
		}
		else
		{
			total += (C - surplus)*price[i];
			surplus = C - (distance[j] - distance[i]) / D2;
		}
	}
	printf("%.2f\n", total);
	return 0;
}
posted @ 2020-05-12 20:09  RabbitJwr  阅读(121)  评论(0编辑  收藏  举报