SDOI2008 燒水問題

2021-08-16 02:10:45 字數 1632 閱讀 3700

把總質量為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,四捨五入到小數點後兩位。

分析找規律:

乙個很容易想到的思路就是把每杯水能傳遞的熱量都給傳遞,考慮第i杯水,如果想要到100℃,那麼從第1杯到第i-1杯水能給它熱傳遞就熱傳遞,這樣可以發現從1到i-1杯水的溫度是遞增的,所以結果一定是最優的,然後把這個暴力打上去後tle……證明這題並沒有我想的這麼簡單。

那麼就要用一些特殊的方法了,注意到題目只給出了乙個數n,而要求輸出一堆東西,那麼很顯然,不是遞推就是數學公式,加上資料有那麼大,可以確定為數學公式,然後發現這個公式我推不出來,那麼這個時候就要找規律了,手動模擬一下。

為了方便起見,每杯水公升1℃需要消耗1j,假設有4杯水,

第一杯水需要消耗100j的能量

第二杯水需要消耗50j的能量

第三杯水需要消耗37.5j的能量

第四杯水需要消耗31.25j的能量

…… 設第i杯水花費的能量為costi

那麼cost2=(1/2)cost1

cost3=(3/4)cost2

cost4=(5/6)cost3

∴對於第i杯水而言,消耗的能量=costi-1 * (2*i-1)/(2*i)

數學規律有時候也要靠找規律找到啊!

#include

#include

int n;

double ans;

int main()

printf("%.2lf",ans+s);

}

SDOI2008 燒水問題

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

SDOI2008 洞穴勘測

lct維護連通性型別的題目,主要是要搞清楚findroot函式的作用 判斷根是否相同,和並查集裡面的find 函式有異曲同工之妙,如果根相同可以認為兩個點具有連通性。先access打通一道到x的實邊,現在x是深度最大的節點。然後再splay x到根節點,因為它深度最大,這個時候它只有左子樹。所以找它...

SDOI2008 洞穴勘測

輝輝熱衷於洞穴勘測 某天,他按照地圖來到了一片被標記為jszx的洞穴群地區 經過初步勘測,輝輝發現這片區域由n個洞穴 分別編號為1到n 以及若干通道組成 並且每條通道連線了恰好兩個洞穴。假如兩個洞穴可以通過一條或者多條通道按一定順序連線起來 那麼這兩個洞穴就是連通的,按順序連線在一起的這些通道則被稱...