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;
}
Yesterday is history,tomorrow ismystery,but today is a gift!That why it is called Present!