题目描述
一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离D1、汽车油箱的容量C(以升为单位)、每升汽油能行驶的距离D2、出发点每升汽油价格P和沿途油站数N(N可以为零),油站ii离出发点的距离Di、每升汽油价格Pi(i=1,2,…,Ni=1,2,…,N)。计算结果四舍五入至小数点后两位。如果无法到达目的地,则输出“No Solution”。
输入格式
第一行,D1,C,D2,P,N。
接下来有N行。
第i+1行,两个数字,油站i离出发点的距离Di和每升汽油价格Pi。
输出格式
所需最小费用,计算结果四舍五入至小数点后两位。如果无法到达目的地,则输出“No Solution”。
输入输出样例
输入 #1
275.6 11.9 27.4 2.8 2 102.0 2.9 220.0 2.2
输出 #1
26.95
说明/提示
N ≤6,其余数字≤500
#include<iostream>
#include<cstdio>
using namespace std;
double dd[15], pp[15];
int main()
{
double d1, c, d2, p;
int n;
cin >> d1 >> c >> d2 >> p >> n;
double dis_max = c * d2;
double pri_min = 501;
pp[0] = p;
for (int i = 1; i <= n; i++)
cin >> dd[i] >> pp[i];
for (int i = 1; i <= n; i++)//到不了的情况;
{
if (dd[i] - dd[i - 1] > dis_max)
{
cout << "No Solution";
return 0;
}
}
int j = 0;
double sum = 0, l = 0, d = 0;//l表示所加油;d表示实际走的距离
while (d1 - d > 0)
{
for (int i = j + 1; dd[i] - d <= dis_max && i <= n; i++)
{
if (pp[i] < pri_min)
{
pri_min = pp[i];
j = i;
}
}
if (pri_min <= p)
{
sum += ((dd[j] - d) / d2 - l) * p;
l = (dd[j] - d) / d2;
}
else if (d1 - d > dis_max)
{
sum += (c - l) * p;
l = c;
}
else
{
sum += ((d1 - d) / d2 - l) * p;
break;
}
l -= (dd[j] - d) / d2;
d = dd[j];
p = pri_min;
pri_min = 501;
}
printf("%.2lf", sum);
return 0;
}