题目
一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离D1、汽车油箱的容量C(以升为单位)、每升汽油能行驶的距离D2、出发点每升汽油价格P和沿途油站数N(N可以为零),油站i离出发点的距离Di、每升汽油价格Pi(i=1,2,…,N)。
输入
每个测试文件只包含一组测试数据,每组输入数据的第一行输入D1、C、D2、P、N,其中D1、C、D2、P均为浮点数,N为整数。
接下来N行,每行输入两个浮点数表示离出发点的距离Di和每升汽油的价格Pi。
输出
对于每组输入数据,输出最小费用,结果四舍五入至小数点后两位。如果无法到达目的地,则输出"No Solution"(引号不输出)。
示例
代码
#include <stdio.h>
#define N 1024
int main()
{
int i,j,k,n;
double d1,c,d2,p[N][2]={0},f,min;
scanf("%lf%lf%lf%lf%d",&d1,&c,&d2,&p[0][1],&n);
n++;
for (i=1;i<n;i++)
scanf("%lf%lf",&p[i][0],&p[i][1]);
p[n++][0]=d1;
f=c*d2;
for(i=0;i<n;i++)
{
if (p[i+1][0]-p[i][0]>f)
{
printf("No Solution");
return 0;
}
}
k =0;
min=0;
for (i=0;i<n-1;i++)
{
double d=p[i+1][0]-p[i][0];
while(d)
{
while(p[i+1][0]-p[k][0]-d>= f)
k++;
for(j=k;j<= i;j++)
if (p[j][1]<p[k][1])
k=j;
double max=f-(p[i+1][0]-p[k][0]-d);
if(max>d)max=d;
d-=max;
min+=max/d2*p[k][1];
}
}
printf("%.2lf\n",min);
return 0;
}