P1016 旅行家的預算

2022-04-06 22:39:37 字數 1452 閱讀 7531

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

輸入格式:

第一行,d1,c,d2,p,n。

接下來有n行。

第i+1行,兩個數字,油站i離出發點的距離di和每公升汽油**pi。

輸出格式:

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

輸入樣例#1:

275.6 11.9 27.4 2.8 2

102.0 2.9

220.0 2.2

輸出樣例#1:

26.95

分析:在能到達的加油站中內尋找最便宜的加油站,然後判斷是否能一次到達,不能的話先加滿,然後乙個乙個判斷直到剩下的油量不足到下乙個加油站就加油,不用加滿。

remain是當前剩餘的油,cost花費,pos目標站

所有有兩種情況:

1.當前站就是pos 再細分兩種情況:

1.從pos就可以走到終點,於是我們把油加到剛好到達終點即可

cost += ((d[i] - d[pos]) / d2 - remain)*p[pos];就得到了最後答案。

2.從pos不能一把走到終點於是,從當前位置走,走到**加油都不如在pos這裡加油划算。所以加滿。

2.當前站點是在pos後面的某個站點,也有兩種情況

1.當前剩餘的油remain不夠走到此站,所以我們把油加來剛好能夠走到此站就行了。(因為這裡便宜!)

2.剩餘的油remain足夠,直接開過去就行了。

1 #include2

intn;

3double

d1,d2,c;

4double remain=0,cost=0;5

double p[1010],d[1010];6

intmain()

713 d[n+1] =d1;

14int pos = 0;15

do25

else

//如果剩餘的油不夠

2630 pos =i;

31 flag = true;32

break;33

}34}35

if(!flag)

3645}46

}47while(pos<=n);

48 printf("

%.2lf

",cost);

49return0;

50 }

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 旅行家的預算

h yp erli nk hyperlink hyperl ink de scri ptio ndescription descri ptio n 有乙個人要從乙個地方a aa開車前往另乙個地方b bb,這之間的距離為d1d1 d1車油箱的容量為c cc,每一公升 可以是小數 汽油能使車行駛d2d2...