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中開不到最後一站時為何直接把油加滿前往下一站是最優的時間複雜度:o(n顯然這個時候我們即使滿油都無法從now
nowno
w到達n
nn,而d2d2
d2是恆定不變的,也就是說到達終點的油量是恆定的。
而我們即使加滿油都到達不了,說明我們的這些油是不會浪費的
既然知道這個加油站無法直接開到終點,如果留著油到後面加顯然不會更優
證畢
)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 計算結果四捨五入至小數點後...