貯油點問題(C語言)

2022-05-07 03:33:15 字數 1963 閱讀 3189

描述 description   

一輛重型卡車欲穿過s公里的沙漠,卡車耗汽油為1公升/公里,卡車總載油能力為w公升。顯然卡車裝一次油是過不了沙漠的。因此司機必須設法在沿途建立若干個貯油點,使卡車能順利穿過沙漠。試問司機如怎樣建立這些貯油點?每一貯油點應儲存多少汽油,才能使卡車以消耗最少汽油的代價通過沙漠?

輸入格式 input format

僅一行,讀入整數s,w(s<=1000,w<=500)。

輸出格式 output format      

程式設計計算及列印建立的貯油點序號,各貯油點距沙漠邊沿出發的距離以及存油量(輸出到小數點後第二位)。

樣例輸入 sample input

1000 500

樣例輸出 sample output

0      0.00   3881.36

1     22.43   3500.00

2     60.89   3000.00

3    106.35   2500.00

4    161.90   2000.00

5    233.33   1500.00

6    333.33   1000.00

7    500.00    500.00

這道題可能有很多人一開始看不懂題目的意思,所以有必要先宣告一下:

就是說一輛車子想要穿過沙漠,但是一次肯定肯定通過不了,因為油箱的油是不夠的,所以我們需要在沿途建立一系列貯油點,注意,汽車邊通過  貯油點也是邊建立的。

就比如說樣例:沙漠全長1000km,油箱容量為500l。輸出就是說我們首先在起點(標號為0)建立乙個3881.36l的貯油點,接下來我們將在距離起點22.43千公尺的位置(標號為1)建立乙個含有3500l油的貯油點,一共跑了17次單程,消耗了381.36l的油,前乙個(起點)貯油點的油已經全運過來了,然後把剩下的3500l油運向下乙個貯油點......直到最後乙個貯油點剩餘500l油,油箱一次加滿剛好跑完剩下的500km。

可見,車子是邊走邊建立儲油點的,車子離開的時候,每個儲油點的油都被運到了下乙個儲油點,到最後車子離開沙漠,油全部用完。我們要求的就是每個貯油點的資訊。(消耗最少汽油的代價通過沙漠)

解題思路:

如果從起點出發順推,則我們無法確定第乙個貯油點的位置及貯油量,因此我們可以用倒推法來解決這個問題:先從終點出發倒推最後乙個儲油點的位置及儲油量,然後再把最後乙個儲油點作為終點,倒推倒數第二個儲油點的位置及儲油量。

就拿樣例來說,如果從頭向後遍歷的話,用dp不可行,因為沒有說明其單位長度,而且dp的複雜度過高,所以從後向前考慮。在最優條件下,應該是卡車在前500公尺用光所有的油,然後在500公尺處灌滿500l,再跑完剩下的500公尺,這樣保證了最後消耗最少的汽油通過沙漠。所以目前明確在距離終點500公尺處要建乙個500l的儲油點。假設這個儲油點左邊x公里有乙個儲油量無限大的儲油點,從此儲油點不斷搬運,使得這個500公尺處的儲油點具有500l。那麼以最優條件下,需要向儲油點灌兩次油,因為一次是肯定運不到這麼多的。第一次:灌500-2xl的油(因為灌完要回來);第二次:灌500-xl的油(灌滿就不用管了),求得x=500/3。可知跑的這兩次一共灌了1000l油(灌滿油箱兩次),所以在距離終點500+500/3km的位置需要修建1000l的儲油點。以此向前遞推,直到到達起始點。

**實現如下:

#includeusing

namespace

std;

double dis[1010],gas[1010

],last,w;

ints,cnt,x;

intmain()

}dis[cnt+1]=0

; gas[cnt+1]=dis[cnt]*(x+2)+gas[cnt];//

最後一次手動處理(起點)

for(int i=cnt+1;i>=1;i--)printf("

%d\t%.2lf\t%.21lf\t\n

",cnt-i+1

,dis[i],gas[i]);

return0;

}

C語言 問題點總結

include int main return0 2.strlen是用來計算字串長度的 但有時編譯器會報錯 strlen was not declared in this scope,如下圖 這個時候只需要加入標頭檔案 include即可解決問題。include include int main 陣...

C語言點餐系統

標籤 c語言 c語言案例 c語言點餐系統 點餐系統 陣列迴圈使用 c語言小案例 這是乙個很簡單的點餐系統,用到的知識也不複雜,所以對新手學習還是很有作用,貼上來給大家參考下。完成了如下功能 1.顯示餐廳提示語 2.列印選單 輸出菜品分類 主食 甜點 飲料 主菜 開胃菜 3.選擇id 進入菜品分類子目...

C語言的注意點

參考 include int main a typedef struct bb printf d d 2f sizeof a sizeof b sizeof a sizeof b 輸出 24 16 0.00 我的電腦是64位 結構體 涉及記憶體對齊以提高記憶體的利用率,位段的使用。因為32位機器的記...