旅行规划问题

算法实现题4-26 旅行规划问题

问题描述: 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<stdio.h>

#include<stdlib.h>

#include<iomanip>

#include<iostream>

#include<vector>

#include<math.h>

#include<algorithm>

#include<string>

#include<sstream>





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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值