把總質量為1kg的水分裝在n個杯子裡,每杯水的質量均為(1/n)kg,初始溫度均為0℃。現需要把每一杯水都燒開。我們可以對任意一杯水進行加熱。把一杯水的溫度公升高t℃所需的能量為(4200*t/n)j,其中,「j」是能量單位「焦耳」。如果一旦某杯水的溫度達到100℃,那麼這杯水的溫度就不能再繼續公升高,此時我們認為這杯水已經被燒開。顯然地,如果直接把水一杯一杯地燒開,所需的總能量為(4200*100)j。
在燒水的過程中,我們隨時可以在兩杯溫度不同的水之間進行熱傳遞操作。熱量只能從溫度較高的那杯水傳遞到溫度較低的那杯水。由於兩杯水的質量相同,所以進行熱傳遞操作之後,原來溫度較高的那杯水所降低的溫度總是等於原來溫度較低的那杯水所公升高的溫度。
一旦兩杯水的溫度相同,熱傳遞立刻停止。
為了把問題簡化,我們假設:
1、沒有進行加熱或熱傳遞操作時,水的溫度不會變化。
2、加熱時所花費的能量全部被水吸收,杯子不吸收能量。
3、熱傳遞總是隔著杯子進行,n杯水永遠不會互相混合。
4、熱傳遞符合能量守恆,而且沒有任何的熱量損耗。
在這個問題裡,只要求把每杯水都至少燒開一遍就可以了,而不要求最終每杯水的溫度都是100℃。我們可以用如下操作把兩杯水燒開:先把一杯水加熱到100℃,花費能量(4200*100/2)j,然後兩杯水進行熱傳遞,直到它們的溫度都變成50℃為止,最後把原來沒有加熱到100℃的那杯水加熱到100℃,花費能量(4200*50/2)j,此時兩杯水都被燒開過了,當前溫度一杯100℃,一杯50℃,花費的總能量為(4200*75)j,比直接燒開所需的(4200*100)j少花費了25%的能量。
你的任務是設計乙個最佳的操作方案使得n杯水都至少被燒開一遍所需的總能量最少。
輸入輸出格式
輸入格式:
輸入檔案只有乙個數n。
輸出格式:
輸出n杯水都至少被燒開一遍所需的最少的總能量,單位為j,四捨五入到小數點後兩位。
輸入輸出樣例
輸入樣例#1:
2
輸出樣例#1:
315000.00
說明
1≤n≤50000
規律題由題目的解釋中我們可以知道,熱傳遞,燒水的先後可以自己定的(這不科學 qaq!!!)
設加熱第一杯水的能量為a=420000/n
先加熱第一杯水至100℃,需要a的能量;
第一杯水的熱量傳遞給第二杯,第一杯變為50℃,第二杯變為50℃;
再加熱第二杯水至100℃,需要a/2的能量;
第一杯的水的熱量傳給第二杯,第一杯變為25℃,第三杯變為25℃;
第二杯的水的熱量傳給第三杯,第二杯變為62.5℃,第三杯變為62.5℃;
(由於如果先把第二杯的水的熱量傳給第三杯,那麼第一杯就無法傳給第三杯了,所以我們先把第一杯的熱量傳給第三杯)
再加熱第三杯水至100℃,需要3*a/8的能量;
第一杯的水的熱量傳給第四杯,第一杯變為12.5℃,第四杯變為12.5℃;
第二杯的水的熱量傳給第四杯,第二杯變為37.5℃,第四杯變為37.5℃;
第三杯的水的熱量傳給第四杯,第三杯變為68.75℃,第四杯變為68.75℃;
(理由同上)
再加熱第四杯水至100℃,需要5*a/16的能量
……我們可以找出乙個規律,即第n+1杯需要的能量為第n杯所需能量的1-0.5/n倍
#include
using
namespace
std;
int n;
double ans,now;
int main()
printf("%.2lf",ans);
return
0;}
洛谷 P1984 SDOI2008 燒水問題
題目描述 把總質量為1kg的水分裝在n個杯子裡,每杯水的質量均為 1 n kg,初始溫度均為0 現需要把每一杯水都燒開。我們可以對任意一杯水進行加熱。把一杯水的溫度公升高t 所需的能量為 4200 t n j,其中,j 是能量單位 焦耳 如果一旦某杯水的溫度達到100 那麼這杯水的溫度就不能再繼續公...
洛谷 P1984 SDOI2008 燒水問題
把總質量為1kg的水分裝在n個杯子裡,每杯水的質量均為 1 n kg,初始溫度均為0 現需要把每一杯水都燒開。我們可以對任意一杯水進行加熱。把一杯水的溫度公升高t 所需的能量為 4200 t n j,其中,j 是能量單位 焦耳 如果一旦某杯水的溫度達到100 那麼這杯水的溫度就不能再繼續公升高,此時...
洛谷 P2147 SDOI2008 洞穴勘測
p2147 sdoi2008 洞穴勘測 思路 按時間分治,然後每條邊有乙個存活時間段,按存活時間段將邊加入劃分樹,然後在劃分樹上分治,用可撤銷並查集維護連通性。pragma gcc optimize 2 pragma gcc optimize 3 pragma gcc optimize 4 incl...