python實現pat 1033. To Fill or Not to Fill (25)

題目傳送門

"""
整理後的算法
#1.將加油站按距離排序
#2.在覆蓋範圍內,按優先級尋找下一個站點:比該站點價格小的最近站點;終點(或者記終點價格爲0)和前者合併;比該站點價格大但範圍內最小的站點
#3.尋找不到下一站點,則輸出最遠距離
#4.到達終點,輸出價格
以下代碼寫得比較粗糙,還有錯誤,暫時就懶得改了。

### 解答
"""
from functools import cmp_to_key
line0=[float(x) for x in input().split(" ")]
cmax,D,dpg,N=line0
N=int(N)
d=cmax*dpg #滿油行駛距離
gs=[] #記錄加油站,價格,距離
for i in range(N):
    line=[float(x) for x in input().split(" ")]
    gs.append(line)
gs.sort(key=cmp_to_key(lambda x,y:x[1]-y[1]))
dis_c=0 #當前的位置
pri_c=gs[0][0] #當前價格
i_c=0  #價格對應的加油站
dis_m=d  #最大的行駛範圍
oil_c=0
i = 1
i_m=0
flag_next=False
sum_d=0
#循環條件寫得很亂
while(i<N):
    flag = True
    j=i
    for pri,dis in gs[i:]:
        if dis <= dis_m:
            if flag:
                pri_m=pri
                flag=False
            if pri<=pri_m:
                flag_next=True
                pri_m=pri
                i_m=j
            if pri_m<pri_c:
                break
        else:
            break
        j += 1
    if flag_next and i_m<N:
        #如果行程範圍內的加油站價格最小值大於當前加油站的價格,那就充滿油到最便宜的加油站
        if pri_c<=pri_m:
            sum_d+=pri_c*(cmax-oil_c)
            oil_c=cmax-(gs[i_m][1]-dis_c)/dpg
        #如果行程範圍內的加油站價格最小值小於當前加油站的價格,那就充足夠的油使其正好能到達最便宜的加油站
        if pri_c>pri_m:
            sum_d+=pri_c*((gs[i_m][1]-dis_c)/dpg-oil_c)
            oil_c=0
        i=i_m
        i+=1
        dis_c=gs[i_m][1]
        dis_m=dis_c+d
        pri_c=pri_m
    else:
        dis_c=dis_c+d
        print("The maximum travel distance = %.2f"%dis_c)
        break
if D-dis_c<=d:
    sum_d+=pri_c*((D-dis_c)/dpg-oil_c)
    print("%.2f"%sum_d)
else:
    dis_c = dis_c + d
    print("The maximum travel distance = %.2f" % dis_c)

結果

一邊寫一邊考慮算法,解答的比較亂,還存在錯誤。暫時沒空修改了。
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章