1006燒水問題

2021-07-27 04:35:16 字數 1425 閱讀 7768

把總質量為1kg的水分裝在n個杯子裡,每杯水的質量均為(1/n)kg,初始溫度均為0℃。現需要把每一杯水都燒開。我們可以對任意一杯水進行加熱。

把一杯水的溫度公升高t℃所需的能量為(4200*t/n)j,其中,「j」是能量單位「焦耳」。如果一旦某杯水的溫度達到100℃,那麼這杯水的溫度就不能再繼續公升高,此時我們認為這杯水已經被燒開。

顯然地,如果直接把水一杯一杯地燒開,所需的總能量為(4200*100)j。

在燒水的過程中,我們隨時可以在兩杯溫度不同的水之間進行熱傳遞操作。熱量只能從溫度較高的那杯水傳遞到溫度較低的那杯水。由於兩杯水的質量相同,所以進行熱傳遞操作之後,原來溫度較高的那杯水所降低的溫度總是等於原來溫度較低的那杯水所公升高的溫度。

一旦兩杯水的溫度相同,熱傳遞立刻停止。

為了把問題簡化,我們假設:

沒有進行加熱或熱傳遞操作時,水的溫度不會變化。 

加熱時所花費的能量全部被水吸收,杯子不吸收能量。 

熱傳遞總是隔著杯子進行,n杯水永遠不會互相混合。 

熱傳遞符合能量守恆,而且沒有任何的熱量損耗。 

在這個問題裡,只要求把每杯水都至少燒開一遍就可以了,而不要求最終每杯水的溫度都是100℃。我們可以用如下操作把兩杯水燒開:先把一杯水加熱到100℃,花費能量(4200*100/2)j,然後兩杯水進行熱傳遞,直到它們的溫度都變成50℃為止,最後把原來沒有加熱到100℃的那杯水加熱到100℃,花費能量(4200*50/2)j,此時兩杯水都被燒開過了,當前溫度一杯100℃,一杯50℃,花費的總能量為(4200*75)j,比直接燒開所需的(4200*100)j少花費了25%的能量。

你的任務是設計乙個最佳的操作方案使得n杯水都至少被燒開一遍所需的總能量最少。

包含多組測試資料。每組測試資料輸入只有乙個整數n。(1<=n<=50000)

每組測試資料輸出佔一行。輸出n杯水都至少被燒開一遍所需的最少的總能量,單位為j,四捨五入到小數點後兩位

2

315000.00

分析:題目的輸入為乙個數n,輸出也為乙個數,很可能涉及到遞推或數學公式。通過計算,我們可知,第一杯水所需熱量(4200*100)/n,第二杯(4200*50)/n,第三杯(4200*37.5)/n,第四杯(4200*31.25)/n……==>cost2 = 1/2cost1、cost3 = 3/4cost2、cost4= 5/6cost3 ==> cost(i) = cost(i-1)*((2*i-1)/(2*i))。

參考**

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

int n;

int main()

printf("%.2f\n",ans);

}return 0;

}

SDOI2008 燒水問題

把總質量為1kg的水分裝在n個杯子裡,每杯水的質量均為 1 n kg,初始溫度均為0 現需要把每一杯水都燒開。我們可以對任意一杯水進行加熱。把一杯水的溫度公升高t 所需的能量為 4200 t n j,其中,j 是能量單位 焦耳 如果一旦某杯水的溫度達到100 那麼這杯水的溫度就不能再繼續公升高,此時...

SDOI2008 燒水問題

把總質量為1kg的水分裝在n個杯子裡,每杯水的質量均為 1 n kg,初始溫度均為0 現需要把每一杯水都燒開。我們可以對任意一杯水進行加熱。把一杯水的溫度公升高t 所需的能量為 4200 t n j,其中,j 是能量單位 焦耳 如果一旦某杯水的溫度達到100 那麼這杯水的溫度就不能再繼續公升高,此時...

luogu1984 燒水問題 找規律

為了節省能量,我們會希望乙個已經燒開了的水溫度越低越好 那麼可以得到結論,它要依次去碰當前溫度從大到小的水 然後再把溫度最高的燒開唄 可是直接模擬會t 稍微寫一寫大概能找到每次燒開花費能量的乙個規律 但我哪找得出來啊 知道了以後也不會證 1 include2 define pa pair3 defi...