演算法訓練 旅行家的預算

2022-08-02 06:21:10 字數 2108 閱讀 2439

原部落格)**(寫的很棒)

題目::

演算法訓練 旅行家的預算  

時間限制:1.0s   記憶體限制:256.0mb

問題描述

乙個旅行家想駕駛汽車以最少的費用從乙個城市到另乙個城市(假設出發時油箱是空的)。給定兩個城市之間的距離d1、汽車油箱的容量c(以公升為單位)、每公升汽油能行駛的距離d2、出發點每公升汽油**p和沿途油站數n(n可以為零),油站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

題目解析:將起點想象成第 0 個加油站,終點想象成 n+1 個加油站

第 0 個加油站距離起點的距離為 0,第 n+1 加油站距離起點的距離為 d1

第 0 個加油站的**為 p,第 n+1 加油站的**為 0

根據油箱容量 c 和每公升汽油能能行駛的距離 d2 可以計算出油箱加滿油可以行駛的最大距離 maxdis

無解:(在輸入時就判斷,盡快找出無解情況)

如果兩個加油站的距離大於加滿油可以行駛的最大距離,那麼無解

有解:

1. 如果能找到了

(1)如果能一次加油到達,那麼加到剛好能到達便宜的加油站即可

(2)如果一次不能到達,那麼先將油箱加滿,到達行駛最大距離之前的那個加油站,再加到剛好行駛到的便宜那個加油站

2. 如果沒找到,則加滿油,行駛到最大距離之前的那個加油站,繼續尋找

注意:終點的加油站**為 0,所以最後一次加油加到剛好到達終點即可

1 #include2 #include3

using

namespace

std;45

#define max_num 100167

intmain()8

35}3637

if(!flag) //

無解 38

4243

/*44

i:當前加油站的編號

45j:下乙個比自己便宜的加油站的編號

46*/

47for (int i = 0, j; i <= n; i = j) //

到達j之後,將j賦值給i,重新迴圈,知道到達終點

4856

if (price[j] <= price[i]) //

找比現在所在的加油站便宜的加油站 57

60}6162

/*63

641 如果能找到了

65(1)如果能一次加油到達,那麼加到剛好能到達便宜的加油站即可

66(2)如果一次不能到達,那麼先將油箱加滿,到達行駛最大距離之前的那個加油站,再加到剛好行駛到的便宜那個加油站

672 如果沒找到,則加滿油,行駛到最大距離之前的那個加油站,繼續尋找

68*/

6970

if (price[j] <= price[i]) //

屬於(1)

7175

else

//屬於(2)或 2

7680}81

82 printf("

%.2lf\n

", total);

8384

return0;

85 }

雖然是照抄,但關鍵你要理解!!!!!!!!

演算法訓練 旅行家的預算

問題描述 乙個旅行家想駕駛汽車以最少的費用從乙個城市到另乙個城市 假設出發時油箱是空的 給定兩個城市之間的距離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 計算結果四捨五入至小數點後兩位。如果無法到達目的地...