一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱时空的)。给定两个城市之间的距离D1、汽车油箱的容量C(以升为单位)、每升汽油能行驶的距离D2、出发点每升汽油价格P和沿途加油站数N(N可以为零),油站i离出发点的距离Di、每升汽油价格Pi(i=1,2,……,N)。
计算结果四舍五入至小数点后两位。
如果无法到达目的地,则输出“No Solution”。
样例:
Input
D1=275.6 C=11.9 D2=27.4 P=2.8 N=2
油站号I
|
离出发点的距离Di
|
每升汽油价格Pi
|
1
|
102.0
|
2.9
|
2
|
220.0
|
2.2
|
Output
26.95(该数据表示最小费用)
代码:
#include <iostream>
int main()
{
double rest=0,need,p[12],s,c,t,d[12];
int n;
scanf("%lf%lf%lf%lf%d",&s,&c,&t,&p[0],&n);
for(int i=1;i<=n;i++)
scanf("%lf%lf",&d[i],&p[i]);
d[0]=0;
d[n+1]=s;
int k=0,j=0,min=0,min2=0,back=0;
double cost=0;
while(k<=n)
 {
j=k;
while(d[j+1]-d[k]<=c*t&&j<=n)
 {
j++;
if(min==0&&p[j]<p[k]) min=j;
if(min2==0||p[j]<p[min2]) min2=j;
}
if(j==k)
 {
printf("No Solution\n");
return 0;
}
if(!min)
 {
need=c-rest;
cost+=need*p[k];
rest=c-(d[min2]-d[k])/t;
k=min2;
}
else
 {
need=(d[min]-d[k])/t-rest;
if(need<0)
need=0;
cost+=need*p[k];
rest=0;
k=min;
}
min=min2=0;
}
printf("%.2lf\n",cost);
return 0;
}
|