前言
好久没碰了,这道挺难的题,花费时间竟然不是很多,看来是消化之后变强了
一、题目
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 的合用。