题解 | #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;
}
全部评论

相关推荐

10-23 16:33
门头沟学院 Java
本人某中9本科,成绩中等,目前没科研没实习,目前后端学到了javaWeb,开始没定好方向,在学国外课程,走工程路线起步有点晚了,到这个时间点了还在学JavaWeb,顿感迷茫,不知道是坚持走下去还是寒假去准备考研。考研这个路弄得我还是心痒痒的,因为从众考研的人也不在少数,所以会有这方面的心理安慰吧,就是“不行我可以去考研啊”,而且意味着三年的缓冲,为了复试还有积攒经验美化简历,其实现在也可以去申入实验室打杂;就业可能意味着多些工作经验,工程岗应该到后面还是经验大于学历?还是有点迷茫了,求助好心人有无路线启发
千千倩倩:同27给点建议,现在这个时间点可以快速看完外卖和点评,不用跟着敲,但一定要在看的时候总结每个部分的整个业务流程,对其中的实现有一个大概的印象。然后直接开始看八股,刷算法。八股和算法最好还是在项目学习中穿插着看。如果计算机基础,算法这些基础好,加上每天刻苦学习,两周可以达到勉强能面试的水平,到时候就直接海投中小厂,在约面和面试的过程中不断巩固知识。没找到实习也没关系,就当积累经验。再沉淀一波直接明年三月开始投暑期,毕竟是9本,总是有面试机会的,只要你这三个月不懈怠,面试发挥得一定不错,只要拿到一个中,大厂暑期实习,秋招就有竞争力了。总得而言,现在还有机会,但是时间非常紧张,需要你结合自己情况考虑,共勉
你会选择考研还是直接就业
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务