P1016 旅行家的预算

Posted mary-sue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1016 旅行家的预算相关的知识,希望对你有一定的参考价值。

题目描述

一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离D1、汽车油箱的容量C(以升为单位)、每升汽油能行驶的距离D2、出发点每升汽油价格PP和沿途油站数NN可以为零),油站ii离出发点的距离Di、每升汽油价格Pi(i=1,2,…,N)。计算结果四舍五入至小数点后两位。如果无法到达目的地,则输出“No Solution”。

输入输出格式

输入格式:

 

第一行,D1,C,D2,P,N。

接下来有N行。

i+1行,两个数字,油站i离出发点的距离Di和每升汽油价格Pi。

 

输出格式:

 

所需最小费用,计算结果四舍五入至小数点后两位。如果无法到达目的地,则输出“No Solution”。

 

输入输出样例

输入样例#1: 复制
275.6 11.9 27.4 2.8 2
102.0 2.9
220.0 2.2
输出样例#1: 复制
26.95

说明

N6,其余数字500

哇哦,这道题我做的可,,真认真。。。

我就感觉这是个模拟嘛,,,

写出来之后发现我那些取优的操作,可不就是贪心。。qwq。

首先我们按照题目要求输入第一行,

一定要注意题目中说的:n可以为0(25分)

所以我们先来处理n==0的情况;

n为0,也就是说从起点到终点,中间没有任何站点可供加油,

所以我们不得不要在起点就加满能够到达终点的油,

当然如果加满了油箱都到达不了,那就是无解了,

可以的话,输出正好到达所需要的花费即可。:

if(n==0)
	{
		if(1.0*d1/d2>c)
		{
			printf("No Solution");
			return 0;
		}
		else
		{
			ans=1.0*d1/d2*p1;
			printf("%.2lf",ans);
			return 0;
		}
	}

然后就考虑一般的情况了(n>0)

首先要输入所有的站点到原点的距离(这是个坑点)和此站点的油单价;

然后这里我们要注意的是:

如果最后一个站点到起点的距离比终点的距离还大,那我们直接把最后一个站点到起点的距离改成终点距离;

而同理,如果最后一个站点还到达不了终点的话,此时我们就相当于再加一个站点,这个站点也就是终点(便于后面计算);

然后很明显的一点是,我们从起点到底一个站点,一定需要花费起点的油,所以我们首先给答案加上起点到第一个站点的油费,

当然这里我们也要考虑一下把油箱全都加满能不能从起点到达第一个站点,如果不能,就直接输出无解:

 

if(1.0*d[1]/d2<c)
		ans+=1.0*d[1]/d2*p1*1.0;
	else
	{
		printf("No Solution");
		return 0;
	}

 

然后接下来就是大部分的操作了:

我们定义一个当前花费cost,一个当前油箱中有多少油now,和两个站点之间的距离s,

因为一号站点已经到达,所以我们从二号站点开始遍历,

每次遍历求出两个站点间的距离s  

 

  

以上是关于P1016 旅行家的预算的主要内容,如果未能解决你的问题,请参考以下文章

P1016 旅行家的预算

p1016旅行家的预算

P1016 旅行家的预算

洛谷P1016 旅行家的预算 贪心

[每日一题]:P1016 旅行家的预算 -- 反悔贪心

[NOIP1999] 提高组 洛谷P1016 旅行家的预算