洛谷P1016旅行家的預算題解 zhengjun

2021-10-02 19:41:48 字數 3177 閱讀 5529

題目描述

乙個旅行家想駕駛汽車以最少的費用從乙個城市到另乙個城市(假設出發時油箱是空的)。給定兩個城市之間的距離d1d1

d1、汽車油箱的容量c

cc(以公升為單位)、每公升汽油能行駛的距離d2d2

d2、出發點每公升汽油**p

pp和沿途油站數n

nn(n

nn可以為零),油站i

ii離出發點的距離d

id_i

di​、每公升汽油**p

ip_i

pi​(i=1

,2,…

,n

i=1,2,…,n

i=1,2,

…,n)。計算結果四捨五入至小數點後兩位。如果無法到達目的地,則輸出no solution

輸入格式

第一行,d1d1

d1,c

cc,d2d2

d2,p

pp,nnn。

接下來有n

nn行。

第 i +1

i+1i+

1 行,兩個數字,油站i

ii離出發點的距離d

id_i

di​和每公升汽油**p

ip_i

pi​。

輸出格式

所需最小費用,計算結果四捨五入至小數點後兩位。如果無法到達目的地,則輸出no solution

輸入輸出樣例

輸入 #1

275.6

11.9

27.4

2.82

102.0

2.9220.0

2.2

輸出 #1
26.95
說明/提示

n ≤6

n \le 6

n≤6,

,, 其餘數字 ≤

500\le 500

≤500

。我一開始做的時候,這麼水的模擬+貪心題怎麼是綠題。

就開始了。

首先,如果在這個點能夠到達的點中沒有比這個點的p

pp更小的了,就找乙個最小的開過去。

可是還有乙個誤區,就是這樣:

d i+

1=di

+1,p

i+

1

d_=d_i+1,p_\lt p_

di+1​=

di​+

1,pi

+1​​di+

2=di

+2,p

i+

2

+1

d_=d_i+2,p_\lt p_

di+2​=

di​+

2,pi

+2​+1​di+

3=di

+3,p

i+

3

+2

d_=d_i+3,p_\lt p_

di+3​=

di​+

3,pi

+3​+2

​這些都是點 i

ii 能夠到達的點。

比較一下以下兩種方案:

直接從 i

ii 到 i+3

i+3i+

3從 i

ii 到 i+1

i+1i+

1 ,從 i+1

i+1i+

1 到 i+2

i+2i+

2 ,從 i+2

i+2i+

2 到 i+3

i+3i+

3應該是方案 2

22 更好。

所以,只要在這個點所能到達的點中直接跳到離這個點最近的並且 p

x

p_x\lt p_i

px​​ 的點上就可以了。

#include

#define maxn 10000

using

namespace std;

double l,c,d,p[maxn]

,w[maxn]

;int n;

intmain()

} w[

++n]

=l; p[n]

=0x3fffffff

;double ans=0;

int now=0;

while

(now!=n)

if(k==now)

更小的px了

k=now+1;

for(

int j=now+

2;j<=n&&w[j]

-w[now]

<=x;j++)if

(p[j]

<=p[k])}

ans+

=(w[k]

-w[now]

)/d*p[now]

; now=k;

}printf

("%0.2lf"

,ans)

;return0;

}

別急著抄**,這還不是正解。

因為,還有一種情況,如果你要去的下乙個點的 p

pp 比當前點的 p

pp 小,那就應該加滿油,到下乙個點的時候稍加一點油,就會更划算。

#include

#define maxn 8

using

namespace std;

double l,c,d,p[maxn]

,w[maxn]

;double y[maxn]

;int n;

intmain()

} w[

++n]

=l; p[n]

=0x3fffffff

;double ans=

0,youliang=0;

int now=0;

while

(now!=n)}if

(k==now)

ans+

=(c-youliang)

*p[now]

; youliang=c-youliang-

(w[k]

-w[now]

)/d;

} now=k;

}printf

("%0.2lf"

,ans)

;return0;

}

洛谷 P1016 旅行家的預算

原題鏈結 這是一道比較簡單的貪心題目。這個題的解法如下 如果把起點定為第0個加油站,終點定為第n 1個加油站。從第0個點開始,驅車至能到達的最遠的那個加油站,在第0個點把油加滿。這其中會遇到三種情況 1.中間有乙個比出發點油價更便宜的加油站。2.中間的油價都比出發點高。3.不能到達下乙個加油站。很容...

洛谷P1016 旅行家的預算 貪心

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

P1016 旅行家的預算

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