最优加油方法---poj 243

已知一条公路上,有一个起点和一个终点,这之间有n个加油站。
已知:从这n个加油站到终点的距离d与各个加油站可以加油的量L,
起点位置至终点的距离L与起始时刻油箱的油量P。假设1个单位的汽油走1个单位的距离,
油箱没有上限,最少加几次油,可以从起点开至终点?(无法到达返回-1)

思考:
汽车经过每个加油站,到底该不该加油,如果所有的都遍历,就是2**n次方,肯定不行。
那么联想到跳跃问题,我们尽可能的晚跳,然后选择最大油量的那个,来加油。
问题的出口:
1.如果加油量+此刻指针的位置坐标 >= 最远 则返回res
2.创建一个最大堆来保存路过的每个加油站的油量,remove 此个加油站,然后需要加的时候,加最大的那个
每加一次 res+=1。当最大堆为0且指针位置,加剩余油量 < 最远 return -1

def jiayou(length,gas,nums):
	   '''
    length:起点到终点的距离
    gas:刚开始的油量
    nums:[(10,2),(14,5),(15,3),(21,4)] 第一个为距离起点的坐标,第二个为可以加的油量
    '''
    dui = []
    res = 0
    for i in range(length):
    	#每走一步,消耗一个油
    	gas -= 1
    	if nums == [] and i + gas >= length:
    		return res
    	elif nums == [] and i + gas < length:
    		return -1
    	else:
    		if i == nums[0][0]:
    			dui.append(nums[0][0])
    			dui.sort(reverse=True)
    			nums.remove(nums[0][0])
    		if gas == 0:
    			gas += dui[0]
    			dui.remove(dui[0])
    			res += 1
    return res
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值