PAT -----To Fill or Not to Fill

前言

好久没碰了,这道挺难的题,花费时间竟然不是很多,看来是消化之后变强了


一、题目

1033
来源:PAT
链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805458722734080

二、解法

1.暴力解法

简单说下思路,此处我用的是从终点回溯的方法,现在想想,从起点开始也可,其实这题目主要看你抓哪个为重点了,毫无疑问,路只能走一次,油价可以多选,所以,只要我们确定这段子路辐射到附近的加油站的油价最低的即可,但是有一个问题啊,这不是一个点,是一条线,所以在线的一端辐射到的最低价和另一端辐射到的最低价不一样,见代码第24行的判断,此时我们可以确定这断路,得分开两段,每边各用自己这边最便宜的油,然后输出结果即可、

maximum_Cap,destination,unitrun,gas_station = map(int,input().split())
maximum_run = maximum_Cap * unitrun
station_mes = []
for i in range(gas_station):
    station_mes.append(list(map(float,input().split())))
station_mes.append([1000,destination])
station_mes.sort(key = lambda  x : x[1])
judge = [ i if (station_mes[i+1][1]-station_mes[i][1]) > maximum_run else 0 for i in range(len(station_mes)-1) ]
if station_mes[0][1]!=0:
    print("The maximum travel distance = 0.00")
elif sum(judge) != 0:
    index = judge.index(1)
    print(f"The maximum travel distance = {(station_mes[index][1] + maximum_run):.2f}")
else:
    sub_start = sub_terminal = total_price = 0
    station_mes.reverse()
    while sub_start < (len(station_mes)-1) :
        sub_disprice = [station_mes[i][0] for i in range(sub_start+1,len(station_mes)) if (station_mes[i][1] >= (station_mes[sub_start][1] - maximum_run ))]
        sub_disprice_post = [station_mes[i][0] for i in range(sub_start+1,len(station_mes)) if (station_mes[i][1] >= (station_mes[sub_start+1][1] - maximum_run ))]
        sub_minprice = min(sub_disprice)
        sub_minprice_post = min(sub_disprice_post)
        if sub_minprice <= sub_minprice_post:
            total_price += (sub_minprice * (station_mes[sub_start][1]-station_mes[sub_start+1][1])/unitrun)
        else:
            post_index = sub_disprice_post.index(sub_minprice_post)+ sub_start + 1
            total_price += ((station_mes[post_index][1]+maximum_run-station_mes[sub_start+1][1])*sub_minprice_post/unitrun)
            total_price += ((station_mes[sub_start][1]-station_mes[post_index][1]-maximum_run)*sub_minprice/unitrun)
        
        sub_start += 1
    print(f"{total_price:.2f}")

在这里插入图片描述
昨天晚上写完第二个测试点不过,快要下雨了就回去了。
今天早上直接百度了,没想到是因为:起点就没有加油站,初始油箱内也没油。自然也就寸步难行了。

总结

之前看其他人写的python代码很pythonic,此处有两点我觉得也很pythonic:
1.加判断的列表生成表达式

sub_disprice = [station_mes[i][0] for i in range(sub_start+1,len(station_mes)) if (station_mes[i][1] >= (station_mes[sub_start][1] - maximum_run ))]

2.f-string 输出格式

print(f"{total_price:.2f}")

还有一个是sort.key 与lambda 的合用。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值