題解 旅行家的預算(貪心)

2021-10-02 11:48:15 字數 1707 閱讀 2497

八中oj 洛谷

這題太複雜了,能否全a看資料。。。

很好的一道模擬貪心題

演算法原理(優先順序)如下:

1.列舉途中經過的加油站,每經過乙個加油站,計算一次花費

2.在乙個加油站所需要加的油,就是能夠支援它到達下乙個油價比它低的加油站的量;

3.如果在這個加油站即使加滿油,都不能到達乙個比它油價低的加油站,(1)就把油箱加滿,前往能夠到達的加油站中油價最低的那個;(2)或者直接到終點;

4.如果在這個加油站即使加滿油,都不能到達任意乙個加油站,也不能到達終點城市,說明無解;

貪心思路就是這樣,能否實現看本事

#include

#include

#include

using

namespace std;

double d1,c,d2,n,p1,lc,ans;

struct liua[

105]

;int

main()

if(bh==0)

else

}else

} ans+

=(a[bh]

.d-i)

*yq/d2,i=a[bh]

.d,yq=a[bh]

.p;}

}printf

("%.2lf"

,ans);}

}

錯因:

1.未考慮是否省錢

2.不是選的最近的油站,而是選最便宜的

3.未考慮剩餘油

樣例輸入:

475.6 11.9 27.4 14.98 6

102.0 9.99

220.0 13.29

256.3 14.79

275.0 10.29

277.6 11.29

381.8 10.09

樣例輸出:

192.15

真實輸出:

192.32

於是我權衡了網上思路,進行第二次嘗試

#include

#include

#include

using

namespace std;

double d1,c,d2,n,p1,lc,ans,yx;

struct liua[

10005];

intmain()

}if(bh!=

0) ans+=(

(a[bh]

.d-i)

*yq-yx)

/d2,i=a[bh]

.d,yq=a[bh]

.p,yx=0;

//剩餘油不可能直接使到達

//不能找到,分為能否直接到達終點以及有無後續加油站兩方面同時考慮

else

//無後續加油站且無法直接到達終點

if(bh==

0&&t//能直接到達,最划算

if(t>=d1)

break;}

//不能直接到達但有後續加油站,先加滿(省錢),記錄剩餘油的多少

//加滿和到最便宜的地方是關鍵

else}}

printf

("%.2lf"

,ans)

;}

寫得算完整了,歡迎打臉質疑我

仔細品味兩次找油站!第一次是省錢且最近,第二次只是最便宜

貪心 旅行家的預算

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

旅行家的預算

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

旅行家的預算

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