1. 程式人生 > >洛谷 P1984 [SDOI2008]燒水問題 解題報告

洛谷 P1984 [SDOI2008]燒水問題 解題報告

永遠 cti 優先 str -s 得到 至少 小數點後兩位 我們

P1984 [SDOI2008]燒水問題

題目描述

把總質量為1kg的水分裝在n個杯子裏,每杯水的質量均為(1/n)kg,初始溫度均為0℃。現需要把每一杯水都燒開。我們可以對任意一杯水進行加熱。把一杯水的溫度升高t℃所需的能量為(4200t/n)J,其中,“J”是能量單位“焦耳”。如果一旦某杯水的溫度達到100℃,那麽這杯水的溫度就不能再繼續升高,此時我們認為這杯水已經被燒開。顯然地,如果直接把水一杯一杯地燒開,所需的總能量為(4200100)J。

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

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

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

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

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

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

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

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

100)J少花費了25%的能量。

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

輸入輸出格式

輸入格式:

輸入文件只有一個數n。

輸出格式:

輸出n杯水都至少被燒開一遍所需的最少的總能量,單位為J,四舍五入到小數點後兩位。

說明

1≤n≤50000


我真的不會找規律,找不出來也不會證,根本沒什麽導向性要往那想,沒救了。

有一個貪心比較顯而易見,每次一個燒開以後優先和當前溫度高的做熱傳遞,並依次傳遞下去。

然後模擬前幾次的狀態

1 2 3 4 5 當前消耗:

1 1/2 1/4 1/8 1/16 ... 1

1 1 5/8 3/8 7/32 ... 1/2

1 1 1 11/16 29/64 ... 5/16

1 1 1 1 93/128 ... 35/128

對當前消耗前後作商,得到規律\(T_{n+1}=T_n*(1-1/2*n)\)

我根本不會往作商想,想了也不會找到遞推式子。。。沒救了怎麽辦啊。。。


2018.6.16

洛谷 P1984 [SDOI2008]燒水問題 解題報告