洛谷 P1016 旅行家的預算

2021-10-09 15:19:18 字數 2425 閱讀 5011

原題鏈結

這是一道比較簡單的貪心題目。這個題的解法如下:

如果把起點定為第0個加油站,終點定為第n+1個加油站。

從第0個點開始,驅車至能到達的最遠的那個加油站,在第0個點把油加滿。這其中會遇到三種情況:

1.中間有乙個比出發點油價更便宜的加油站。

2.中間的油價都比出發點高。

3.不能到達下乙個加油站。

很容易知道,第三種情況下是不能夠到達的。如果是第一種情況,只需要在初始點加油至能夠到達那個加油站即可,把剩餘的油賣出(相當於加油時沒有加滿),然後加滿低價油。如果是第二種情況,則需要在這裡所有經過的的加油站中選擇乙個油價最便宜的乙個加油站,把油加滿(不賣油)。在第一或第二種的情況下,以選擇的加油站作為起點,重複操作。

這裡解釋一下原因:第一種情況很容易理解,從出發點到油價更低點,中間的油價均高於出發點。用**更低的油必然比用出發點的油好。第二種情況,是因為在出發點的油價比路程中遇到的油價都要便宜,但是如果消耗完油量後依然不能到達終點,這種情況下就需要加油了。顯然,用這之中最便宜的加油站補充油顯然是最合適的。

這裡可能會有乙個疑問:如果先是遇到第二種情況,後遇到第一種情況,賣油時的**怎麼算?這裡油價應該是選用第二種情況下選的加油站的油價。因為遇到第一種情況時,這個加油站油價會比第二種情況遇到的加油站便宜,這樣一定會超出第二種情況的最長路程。所以之前加的油已經消耗完了,剩餘的是第二種情況時加的油。

**如下:

#include

#include

#include

#include

#include

using

namespace std;

double d1,c, d2, p;

int n;

// dis陣列儲存的是第i個加油站到第i-1個加油站的距離

double dis[

510]

;// pdis陣列儲存的是第i個加油站到第0個加油站的距離

double pdis[

510]

;// pri陣列儲存的是每個加油站的**

double pri[

510]

;// s儲存的是滿油量的最長路程

int s;

// gas結構體儲存的是加油站的位置和**

struct gas gas;

// gas儲存的是每一次行進中油價最低的加油站(不考慮出發點)

intmain()

// 第n+1個加油站到第0個加油站的距離就是d1

pdis[n +1]

= d1;

// 類似於差分陣列,後減前

dis[n +1]

= d1 - dis[n]

;for

(int i = n; i >=

1; i--

) dis[i]

= dis[i]

- dis[i -1]

; s = c * d2;

// sum_price儲存總油費,sum_volume儲存剩餘油量

// 初始化

double sum_price = c * p;

double sum_volume = c;

gas start =

;// 第n+1個加油站賦值為乙個較大的數

pri[0]

= p, pri[n +1]

=0x3f3f3f

;// flag記錄是否可以到達終點

bool flag =1;

// gas初始化,從第乙個加油站開始

gas.index =

1, gas.price = pri[1]

;for

(int i =

0; i <= n +

1; i++

)// temp記錄行駛乙個加油站距離後剩餘的油量

double temp = sum_volume - dis[i]

/ d2;

if(temp <0)

;// 計算加滿油所需的錢

sum_price +

=(c - sum_volume)

* pri[i]

; sum_volume = c;

}else

// 減去路程中消耗的油量

sum_volume -

= dis[i]

/ d2;

if(start.price >= pri[i])}

}// 減去最後剩餘的油

sum_price -

= sum_volume * start.price;

// 輸出if(

!flag)

cout <<

"no solution"

;else

cout << fixed<<

setprecision(2

)

}

洛谷P1016 旅行家的預算 貪心

這道題就是貪心 1 在第乙個加油站的時候,如果在加滿油能夠到達的加油站中有乙個加油站的錢比自己的少 其實等於也行 那就 加足夠到那個車站的油,直接去那個車站 2 這些車站中所有都比自己大,那就找乙個其中錢最少的車站 在當前車站加滿油,然後直接開到那個車站 3 然後到達車站時就不斷重複以上的處理方法 ...

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 計算結果四捨五入至小數點...