问题描述: 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
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef struct{
int id ;
double dis ;
double price ;
}P;
vector < P > v ;
double d0 , c, e ;
P p ;
bool seq( P p1 , P p2 ){
return p1.price < p2.price ;
}
bool run( int n ){
v.resize( 0 );
v.push_back( p ) ;
P p1 ;
int i ;
for( i = 1 ; i <= n ; i++ ){
p1.id = i ;
cin >> p1.dis >> p1.price ;
v.push_back( p1 ) ;
}
p1.id = i ;
p1.dis = d0 ;
p1.price = 0 ;
v.push_back( p1 ) ;
double dmax ;
dmax = c * e ;
int f = i , now = 0 ;
double sum = 0 ;
double po = 0.0 ;
// cout << f << endl;
while( now != f ){
vector < P > v1 ;
for( i = now + 1 ; i <= f ; i++ ){
if( v[ i ].dis - v[ now ].dis <= dmax ){
v1.push_back( v[ i ] );
}
else break ;
}
if( !v1.size() ) { sum = -1 ; break; }
int s = 0 , flag = 0 ;
double noil ;
for( int j = 0 ; j < v1.size() ; j++ ){
if( v1[ j ].price < v[ now ].price ){
s = j ;
flag = 1 ;
break ;
}
}
if( flag ){
if( po < ( v1[ s ].dis - v[ now ].dis ) * 1.0 / e )
noil = ( v1[ s ].dis - v[ now ].dis ) * 1.0 / e - po ;
else
noil = 0 ;
}
else {
if( v1[ v1.size() - 1 ].id == f ) noil = ( d0 - v[ now ].dis ) * 1.0 / e - po ;
else noil = dmax * 1.0 / e - po ;
}
sum += noil * v[ now ].price ;
po = po + noil ;
po -= ( v1[ s ].dis - v[ now ].dis ) * 1.0 / e ;
now = v1[ s ].id ;
}
if( sum == -1 ) cout << "No Solution" << endl;
else printf("%.2lf/n",sum);
return true;
}
int main(){
p.id = 0 ; p.dis = 0.0 ;
int n ;
while( cin >> d0 >> c >> e >> p.price >> n ){
run( n );
}
return 0;
}