貪心演算法 旅行家的預算(NOIP1999)

2021-09-16 22:42:49 字數 2017 閱讀 7625

問題描述:

乙個旅行家想駕駛汽車以最少的費用從乙個城市到另乙個城市(假設出發時油箱是空的)。給定兩個城市之間的距離d1、汽車油箱的容量c(以公升為單位)、每公升汽油能行駛的距離d2、出發點每公升汽油**p和沿途油站數n(0 <= n <= 100),油站i離出發點的距離di、每公升汽油**pi(i=1,2,……n)。計算結果四捨五入至小數點後兩位。如果無法到達目的地,則輸出「no solution」。

輸入

第一行為4個實數d1、c、d2、p與乙個非負整數n;

接下來n行,每行兩個實數di、pi。

輸出

如果可以到達目的地,輸出乙個實數(四捨五入至小數點後兩位),表示最小費用;否則輸出「no solution」(不含引號)。

樣例輸入

275.6 11.9 27.4 2.8 2

102.0 2.9

220.0 2.2

【樣例輸出】

26.95
策略分析:

旅行家的預算問題,需要想清楚情況才能做,首先要總的消費小,我們每次加油都需要考慮油價盡可能便宜的加油站加油,那麼需要在當前的位置下,假如加滿油,看看能經過多少個加油站,然後進行判斷,那麼可以分成兩種情況來做

1、在當前加滿油後能到達的所有加油站中比較油價,假如當前位置的油價最低,那麼一定要加滿油,然後開到下乙個加油站在再次進行比較選擇

2、在當前加滿油後能到達的所有加油站中比較油價,假如出現了更便宜的加油站,那麼只需要加的油夠剛好到達那乙個加油站即可

反覆判斷這兩種情況,這樣的選擇才能保證是最優的

由於注釋寫的很清楚,就不過多贅述

**

#include 

#include

#define maxn 105

using namespace std;

struct oil a[maxn]

;bool cmp

(oil x, oil y)

double d1, c, d2, p;

//分別表示總距離d1,容量c,每公升油行駛距離d2,出發點**p

double dis, loc, ca, cost, reach, mn;

//分別表示加滿油能跑的距離dis,當前位置loc,油箱中油量ca,花費的錢cost, reach表示加滿油能到的位置

// 把p表示成當前油價,每次更新即可

int i =

1, t, n;

bool flag;

intmain()

sort

(a, a+n+

1, cmp)

; i =0;

while

(loc < d1)}if

(!flag)

t = i +1;

//開到下乙個加油站

cost +=

(c-ca)

* p;

//將油加滿

ca = c -

(a[t]

.d - loc)

/ d2;

//減去到達下乙個點耗費的油

loc = a[t]

.d;//更新

p = a[t]

.p; i = t;

}else

else

//如果油夠則直接減去損耗的油

ca -=

(a[t]

.d - loc)

/ d2;

loc = a[t]

.d;//更新

p = a[t]

.p; i = t;}}

printf

("%.2lf\n"

, cost)

;return0;

}

貪心 旅行家的預算

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

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

八中oj 洛谷 這題太複雜了,能否全a看資料。很好的一道模擬貪心題 演算法原理 優先順序 如下 1.列舉途中經過的加油站,每經過乙個加油站,計算一次花費 2.在乙個加油站所需要加的油,就是能夠支援它到達下乙個油價比它低的加油站的量 3.如果在這個加油站即使加滿油,都不能到達乙個比它油價低的加油站,1...

旅行家的預算

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