P1016 旅行家的預算

2021-10-09 17:34:27 字數 2368 閱讀 3026

h yp

erli

nk

hyperlink

hyperl

ink de

scri

ptio

ndescription

descri

ptio

n 有乙個人要從乙個地方a

aa開車前往另乙個地方b

bb,這之間的距離為d1d1

d1車油箱的容量為c

cc,每一公升(可以是小數)汽油能使車行駛d2d2

d2的距離在a

aa這個地方有乙個加油站,每公升(可以是小數)汽油售價ppp元

a ,b

a,ba,

b之間另外有n

nn個加油站,第i

ii個加油站距離adi

a\ d_i

adi​

千公尺,它的汽油售價為p

ip_i

pi​元/公升(可以是小數 )

問到達b

bb的最小花費,如果不能到達,輸出no solution

資料範圍:n≤6

n\leq 6

n≤6

s ol

utio

nsolution

soluti

on 把a

aa看做0號加油站,把b

bb看做n+1

n+1n+

1號加油站但不能加油

令n =n

+1

n=n+1

n=n+

1(新建b

bb這個加油站)

則d 1=

dn

d1=d_n

d1=dn​

no solution這種情況顯然可以預處理,即是否∃

i\exists i

∃i滿足d i−

di−1

>c×

d2

d_i-d_>c\times d_2

di​−di

−1​>c×

d2​,即充滿油都去不了,那麼顯然無解

接下來考慮貪心

顯然我們是不會走回頭路的

定義m in

_idi

min\_id_i

min_id

i​表示字尾min

minmi

n對應的位置(即i∼n

i\sim n

i∼n之間油價最低的加油站(n

nn號站即b

bb除外,它不能加油))

則每個i

ii對應的min

_idi

min\_id_i

min_id

i​一定是對於i

ii的最佳加油點,則我們可以得到下面這個貪心策略

對於現在所處的位置now

nowno

w 如果它是min

_idn

ow

min\_id_

min_id

now​

,盡可能開到最後一站

否則,把油加滿,前往下乙個城市

如果它不是min

_idn

ow

min\_id_

min_id

now​

,則盡可能開到那裡

考慮證明1中開不到最後一站時為何直接把油加滿前往下一站是最優的

顯然這個時候我們即使滿油都無法從now

nowno

w到達n

nn,而d2d2

d2是恆定不變的,也就是說到達終點的油量是恆定的。

而我們即使加滿油都到達不了,說明我們的這些油是不會浪費的

既然知道這個加油站無法直接開到終點,如果留著油到後面加顯然不會更優

證畢

時間複雜度:o(n

)o(n)

o(n) cod

ecode

code

#include

using

namespace std;

double d1,d2,c,d[8]

,p[8

],min[8]

,now_oil,now_cost,need;

int n,min_id[7]

,now;

signed

main()

if(c>=need)

//可以通過加油前往終點

else

//否則,加滿油,去下一站

}else

//不是最優站點

else

//不夠的話加油到剛剛好再去}}

printf

("%.2lf"

,now_cost)

;}

P1016 旅行家的預算

乙個旅行家想駕駛汽車以最少的費用從乙個城市到另乙個城市 假設出發時油箱是空的 給定兩個城市之間的距離d1d1 汽車油箱的容量cc 以公升為單位 每公升汽油能行駛的距離d2d2 出發點每公升汽油 pp和沿途油站數nn nn可以為零 油站ii離出發點的距離didi 每公升汽油 pipi i 1,2,ni...

P1016 旅行家的預算

乙個旅行家想駕駛汽車以最少的費用從乙個城市到另乙個城市 假設出發時油箱是空的 給定兩個城市之間的距離d1 汽車油箱的容量c 以公升為單位 每公升汽油能行駛的距離d2 出發點每公升汽油 p和沿途油站數n n可以為零 油站ii離出發點的距離di 每公升汽油 pi i 1,2,n 計算結果四捨五入至小數點...

P1016 旅行家的預算

乙個旅行家想駕駛汽車以最少的費用從乙個城市到另乙個城市 假設出發時油箱是空的 給定兩個城市之間的距離d1 汽車油箱的容量c 以公升為單位 每公升汽油能行駛的距離d2 出發點每公升汽油 p和沿途油站數n n可以為零 油站i離出發點的距離di 每公升汽油 pi i 1,2,n 計算結果四捨五入至小數點後...