题目描述
一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离D1、汽车油箱的容量C(以升为单位)、每升汽油能行驶的距离D2、出发点每升汽油价格PP和沿途油站数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”。
输入输出样例
275.6 11.9 27.4 2.8 2
102.0 2.9
220.0 2.2
输出 #1复制
26.95
#include<iostream>
#include<iomanip>
using namespace std;
int j = 0;
struct petrol
{
double price;
double distance;
};
void Solution(double D1, double C, double D2, double max_dis, petrol* p, int N, double money)
{
double more = 0;
for (int i = 0; i < N + 1;)
{
if (p[i + 1].distance - p[i].distance > max_dis)
{
cout << "No Solution";
return;
}
for ( j = i + 1; j <= N + 1; j++)
{
if (p[j].distance - p[i].distance > max_dis)
{
j =j- 1;
break;
}
if (p[j].distance - p[i].distance < max_dis && p[j].price < p[i].price)
break;
}
if (p[j].price <= p[i].price)
{
if (D2 * more > p[j].distance - p[i].distance)
more -= (p[j].distance - p[i].distance) / D2;
else
{
money += ((p[j].distance - p[i].distance) / D2 - more) * p[i].price;
more = 0;
}
}
else
{
money += (C - more) * p[i].price;
more = C - (p[j].distance - p[i].distance) / D2;
}
i = j;
}
cout << fixed << setprecision(2) << money;
}
int main()
{
double D1, C, D2, P;
double money = 0;
int N;
cin >> D1 >> C >> D2 >> P >> N;
double max_dis = C * D2;
petrol* p = new petrol[2 + N];
p[0].distance = 0;
p[0].price = P;
p[N + 1].distance = D1;
p[N + 1].price = 0;
for (int i = 1; i < N + 1; i++)
cin >> p[i].distance >> p[i].price;
Solution(D1, C, D2, max_dis, p, N, money);
}