旅行家的预算
上机内容:C++
上机目的:
题目描述
一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离D1D1、汽车油箱的容量CC(以升为单位)、每升汽油能行驶的距离D2D2、出发点每升汽油价格PP和沿途油站数NN(NN可以为零),油站ii离出发点的距离DiDi、每升汽油价格PiPi(i=1,2,…,Ni=1,2,…,N)。计算结果四舍五入至小数点后两位。如果无法到达目的地,则输出“No Solution”。
输入格式
第一行,D1D1,CC,D2D2,PP,NN。
接下来有NN行。
第i+1i+1行,两个数字,油站i离出发点的距离DiDi和每升汽油价格PiPi。
输出格式
所需最小费用,计算结果四舍五入至小数点后两位。如果无法到达目的地,则输出“No Solution”。
输入输出样例
输入
275.6 11.9 27.4 2.8 2
102.0 2.9
220.0 2.2
输出
26.95
说明/提示
N≤6,其余数字≤500
我的程序:
#include <iostream>
using namespace std;
int main()
{
float D1,C,D2,P,Di,Pi;
int N;
cin>>D1>>C>>D2>>P>>N;
if(N==0)//如果没有油站//
{
if(D1/D2<=C)//如果油箱容量的油能够走完全程
cout<<D1/D2*P<<endl;//用两城市间的距离求出需要油量即可
else
cout<<"No Solution"<<endl;
}
else//即中途有油站
{
float price[N+1];
for(int i=0;i<=N;i++)
price[i]=P;
float distance[N+1];
for(int i=1;i<=N;i++)
{
cin>>Di>>Pi;
price[i]=Pi;
distance[i]=Di;
}
double dis=0;//当前路程
double oil=0;//当前油量
double pri=0;//当前花费
int stop=0;//当前油站的下标
while(dis<D1)//反复贪心
{
double min=500;
int idx=0;
for(int i=0;i<=N;i++)//找出未经过的最便宜油站
{
if(price[i]<min&&distance[i]>=dis)
{
min=price[i];
idx=i;
}
}
if(distance[idx]==dis)//如果当前恰好在最便宜的油站
{
if(dis+oil*D2>=D1)//如果油量足够到达终点
dis=D1;
else if(dis+C*D2>=D1)//如果加满油能够到达终点
{
pri+=((D1-dis)/D2-oil)*price[idx];
dis=D1;
}
else//如果加满油仍无法到达终点
{
pri+=(C-oil)*price[idx];//加满油
oil=C;
oil-=(distance[idx+1]-dis)/D2;//到达下一个油站
dis=distance[idx+1];
stop=idx+1;
}
}
else//如果此站不是最便宜的油站
{
if(distance[idx]<=oil*D2+dis)//如果当前油量能够到达最便宜的油站
{
oil-=(distance[idx]-dis)/D2;//到达最便宜的油站
dis=distance[idx];
stop=idx;
}
else//如果不能够到达最便宜的油站
{
pri+=(distance[idx]-dis)/D2*price[stop];//在此站加到刚好可以到达最便宜的油站
oil=0;
dis=distance[idx];//到达最便宜的油站
stop=idx;
}
}
}
printf("%.2f\n",pri);
}
return 0;
}
运行结果:
心得体会:
做完这道题,算是领略了一个新的题型,希望自己能够记住并且以后能够学会运用这种思维。