题解 | #To Fill or Not to Fill#

To Fill or Not to Fill

http://www.nowcoder.com/questionTerminal/f7eba38f7cd24c45982831e0f38518f9

贪心还是要多思考,不然写到后面发现思路是错的

问题分解为每次在加油站加多少油

  • ①最大行驶距离内有更便宜的加油站,只需加刚好能到的油
  • ②直接能到终点,只需加刚好能到的油
  • ③否则将油加满 a、有其他更贵的加油站,寻找相对便宜的加油站 b、输出最大行驶距离
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=510;
struct station{
    double price;
    double dist;
};
bool compare(station x,station y){
	return x.dist<y.dist;
}
station supply[maxn];

int main(){
    int cmax,destination,davg,n;//油箱最大容量、目的地距离、单位油耗可行驶距离、加油站数量
    while(scanf("%d%d%d%d",&cmax,&destination,&davg,&n)!=EOF){
        for(int i=0;i<n;i++){
            scanf("%lf%lf",&supply[i].price,&supply[i].dist);
        }
        sort(supply,supply+n,compare);//按距离升序
       
        double tank=0;//油量 
        double count=0,money=0;//行驶距离、花费 
        double mi=0;
        int j=-1; //所在加油站编号
        if(0==supply[0].dist)j=0;
		else{ //初始位置没有加油站
			printf("The maximum travel distance = 0\n");
			continue;
		}
        
	while(1){
		bool flag=false;
		for(int i=j+1;i<n;i++){//有更便宜的加油站 
			if(supply[i].dist>count+cmax*davg)break;//超出到达距离
			if(supply[i].price<=supply[j].price){
					money+=((supply[i].dist-count)/davg-tank)*supply[j].price;//加油至恰能到达下一个便宜加油站
				   // printf("%.2lf\n",money);//
					tank=0;
				//printf("有更便宜的%d加油站,油价:%lf 空箱达到\n",i+1,supply[i].price); //
				j=i;//更新所在加油站编号
				count=supply[i].dist;//更新行驶距离
				flag=true;
				break; 
			}
		}
		if(!flag){
			if(count+cmax*davg>=destination){//直接到达终点 
				money+=((destination-count)/davg-tank)*supply[j].price;
				printf("%.2lf\n",money);
				break;
			}
			else{//加满油
				money+=(cmax-tank)*supply[j].price;
				//	printf("%.2lf\n",money);//
				tank=cmax;
				int k=-1;//记录相对便宜的加油站编号
				bool flag=false;//记录有无相对便宜的加油站
				for(int i=j+1;i<n;i++){
					if(supply[i].dist<=count+cmax*davg){
						if(flag==false){
							mi=supply[j].price-supply[i].price;
							flag=true;
							k=i;
						}
						else if(supply[j].price-supply[i].price>mi){
							k=i;
							mi=supply[j].price-supply[i].price;
						}
					}
				}
				if(k!=-1){
					tank=cmax-(supply[k].dist-count)/davg;//更新油量
					j=k;
					count=supply[k].dist;//更新行驶距离	
				}
				else{
					printf("The maximum travel distance = %.2lf\n",count+tank*davg);
					break; 
				}
			}
		}
	}
        }
    return 0;
}
全部评论

相关推荐

点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务