码迷,mamicode.com
首页 > 其他好文 > 详细

1033. To Fill or Not to Fill (25)

时间:2017-10-25 11:35:48      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:turn   reac   def   else   ota   整理   ++   not   nbsp   

With highways available, driving a car from Hangzhou to any other city is easy. But since the tank capacity of a car is limited, we have to find gas stations on the way from time to time. Different gas station may give different price. You are asked to carefully design the cheapest route to go.

Input Specification:

Each input file contains one test case. For each case, the first line contains 4 positive numbers: Cmax (<= 100), the maximum capacity of the tank; D (<=30000), the distance between Hangzhou and the destination city; Davg (<=20), the average distance per unit gas that the car can run; and N (<= 500), the total number of gas stations. Then N lines follow, each contains a pair of non-negative numbers: Pi, the unit gas price, and Di (<=D), the distance between this station and Hangzhou, for i=1,...N. All the numbers in a line are separated by a space.

Output Specification:

For each test case, print the cheapest price in a line, accurate up to 2 decimal places. It is assumed that the tank is empty at the beginning. If it is impossible to reach the destination, print "The maximum travel distance = X" where X is the maximum possible distance the car can run, accurate up to 2 decimal places.

Sample Input 1:

50 1300 12 8
6.00 1250
7.00 600
7.00 150
7.10 0
7.20 200
7.50 400
7.30 1000
6.85 300

Sample Output 1:

749.17

Sample Input 2:

50 1300 12 2
7.10 0
7.00 600

Sample Output 2:

The maximum travel distance = 1200.00

题目大意:从起点到目的点有N个加油站,求从经过的站点最小的耗费油钱。
解题思路:本着利用贪心算法来解,但代码一直敲不出!参考别人代码后,整理下。首先从点s1到s2,情况有几种。1、s1到s2在可达范围
内(小于Cmax*Davg)时,如果s2的油价比s1的便宜,则在s1加的油量只需能够到s2就行;相反,如果s2的油价比s1的贵,则需要在s1加
满油到s2,此时在s2时还有油剩余。在s2时加的油量只需Cmax-剩余的油量即可。2、如果s1到s2不可达(大于Cmax*Davg),此时只需在
s1上加满油,任车子能走多远就走多远。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define INF 0x6ffffff
int  Cmax,D,Davg,N;
struct Station{
	double price;
	int dist;
};
Station sta[502];
bool cmp(Station s1,Station s2){
	return s1.dist<s2.dist;
}
int main(){
	scanf("%d%d%d%d",&Cmax,&D,&Davg,&N);
	int max_dist=Cmax*Davg;
	int i,j;
	for(i=0;i<N;i++){
		scanf("%lf%d",&sta[i].price,&sta[i].dist);
	}
	sort(sta,sta+N,cmp);
	if(sta[0].dist>0||N==0){
		printf("The maximum travel distance = 0.00\n");
		return 0;
	}
	int targe;
	double sum=0.0;
	double left = 0.0;
	i=0;
	int t;
	sta[N].dist=D;
	sta[N].price=INF;
	for(i=0;i<N;i++){
		if(i!=0){
			left-=((double)(sta[i].dist-sta[i-1].dist)/Davg);//算出从i-1到i的消耗油量。 
		}
		j=i+1;
		while(j<N && sta[j].price>=sta[i].price){//查找比i站油价小的站点j。 
			j++;
		}
		if(sta[j].dist-sta[i].dist>max_dist){
			sum+=(double)(Cmax-left)*sta[i].price;
			left=Cmax;
		}else {
			double d=(double(sta[j].dist-sta[i].dist))/Davg - left;
			if(fabs(d)>1e-8&&d>0){
				sum+=d*sta[i].price;
				left = (double(sta[j].dist-sta[i].dist)/Davg);//因为j的油价更便宜,只要能够到J点后的油即可。 
			}
		}
		if(sta[i+1].dist - sta[i].dist > max_dist){
			printf("The maximum travel distance = %.2lf\n",(double)(sta[i].dist+max_dist));
			break;
		}
	} 
	if(i == N){
		printf("%.2lf\n",sum);
	}
	return 0;
}

  




      

1033. To Fill or Not to Fill (25)

标签:turn   reac   def   else   ota   整理   ++   not   nbsp   

原文地址:http://www.cnblogs.com/grglym/p/7727265.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!