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; }