
G 先生想独自驾驶汽车从城市A 到城市B。从城市A 到城市B 的距离为d0 公里。汽车油箱的容量为c 公升。每公升汽油能行驶e 公里。出发点每公升汽油的价格为p 元。从城市A到城市B 沿途有n 个加油站。第i 个加油站距出发点的距离为di,油价为每公升pi元。如何规划才能使旅行的费用最省。
编程任务:
对于给定的d0,c,e,p,和n 以及n个加油站的距离和油价di 和pi,编程计算最小的旅行费用。如果无法到达目的地,输出“No Solution”。
Input
每组测试数据的第1 行是d0,c,e,p,和n。接下来的n 行中每行2个数di 和pi。
Output
输出最小的旅行费用,精确到小数点后2 位。每个答案1行。
Sample Input
275.6 11.9 27.4 2.8 2
102.0 2.9
220.0 2.2
Sample Output
26.95
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std ;
double f[10005][2];
double ff[10005][2];
bool run()
{
double d,c,e,p;
int n,k;
if ( ! ( cin>>d>>c>>e>>p>>n ) ) return false;
int i,j;
ff[0][0]=0;
ff[0][1]=p;
for ( i=1; i<=n; i++ )
{
cin>>ff[i][0]>>ff[i][1];
}
ff[n+1][0]=d;
ff[n+1][1]=0;
n++;
fill ( &f[0][0],&f[10003][1],0 );
double t,x;
double y,a[2],b,q;
for ( i=1; i<=n; i++ )
{
for ( j=0; j<i; j++ )
{
t=ff[i][0]-ff[j][0];
x=f[j][0]*e;
if ( x>=t )
{
y= ( double ) t/e;
a[0]=f[j][0]-y;
a[1]=f[j][1];
q=f[j][0];
}
else
{
y= ( double ) ( ( t-x ) /e );
if ( y+f[j][0]>c ) continue;
a[0]=0;
a[1]=f[j][1]+y*ff[j][1];
q=f[j][0]+y;
}
if ( ff[j][1]<ff[i][1] )
{
b= ( d-ff[j][0] ) /e;
if ( ( c-q ) <b ) b=c-q;
for ( k=i+1; k<=n; k++ )
{
if ( ( ff[i][0]+b*e ) >=ff[k][0] )
{
if ( ff[k][1]<ff[j][1] )
{
b= ( ff[k][0]-ff[i][0] ) /e;
break;
}
}
else
break;
}
a[1]+=b*ff[j][1];
a[0]+=b;
}
if ( a[0]==f[i][0]||f[i][1]==0 )
{
if ( a[1]<f[i][1]||f[i][1]==0 )
{
f[i][0]=a[0];
f[i][1]=a[1];
}
}
else if ( a[0]>f[i][0] )
{
if ( a[1]< ( a[0]-f[i][0] ) *ff[i][1]+f[i][1] )
{
f[i][0]=a[0];
f[i][1]=a[1];
}
}
else if ( a[0]<f[i][0] )
{
if ( a[1]+ ( f[1][0]-a[0] ) *ff[i][1]<f[i][1] )
{
f[i][0]=a[0];
f[i][1]=a[1];
}
}
}
}
if ( f[n][1]==0 )
{
cout<<"No Solution\n";
}
else
printf ( "%.2lf\n",f[n][1] );
return true;
}
int main()
{
while ( run() );
return 0;
}



