描述 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的儲油點。以此向前遞推,直到到達起始點。
**實現如下:
#includeusingnamespace
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位機器的記...