把總質(zhì)量為1kg的水分裝在n個(gè)杯子里,每杯水的質(zhì)量均為(1/n)kg,初始溫度均為0℃。現(xiàn)需要把每一杯水都燒開(kāi)。我們可以對(duì)任意一杯水進(jìn)行加熱。把一杯水的溫度升高t℃所需的能量為(4200*t/n)J,其中,“J”是能量單位“焦耳”。如果一旦某杯水的溫度達(dá)到100℃,那么這杯水的溫度就不能再繼續(xù)升高,此時(shí)我們認(rèn)為這杯水已經(jīng)被燒開(kāi)。顯然地,如果直接把水一杯一杯地?zé)_(kāi),所需的總能量為(4200*100)J。在燒水的過(guò)程中,我們隨時(shí)可以在兩杯溫度不同的水之間進(jìn)行熱傳遞操作。熱量只能從溫度較高的那杯水傳遞到溫度較低的那杯水。由于兩杯水的質(zhì)量相同,所以進(jìn)行熱傳遞操作之后,原來(lái)溫度較高的那杯水所降低的溫度總是等于原來(lái)溫度較低的那杯水所升高的溫度。一旦兩杯水的溫度相同,熱傳遞立刻停止。為了把問(wèn)題簡(jiǎn)化,我們假設(shè):沒(méi)有進(jìn)行加熱或熱傳遞操作時(shí),水的溫度不會(huì)變化。 加熱時(shí)所花費(fèi)的能量全部被水吸收,杯子不吸收能量。 熱傳遞總是隔著杯子進(jìn)行,n杯水永遠(yuǎn)不會(huì)互相混合。 熱傳遞符合能量守恒,而且沒(méi)有任何的熱量損耗。 在這個(gè)問(wèn)題里,只要求把每杯水都至少燒開(kāi)一遍就可以了,而不要求最終每杯水的溫度都是100℃。我們可以用如下操作把兩杯水燒開(kāi):先把一杯水加熱到100℃,花費(fèi)能量(4200*100/2)J,然后兩杯水進(jìn)行熱傳遞,直到它們的溫度都變成50℃為止,最后把原來(lái)沒(méi)有加熱到100℃的那杯水加熱到100℃,花費(fèi)能量(4200*50/2)J,此時(shí)兩杯水都被燒開(kāi)過(guò)了,當(dāng)前溫度一杯100℃,一杯50℃,花費(fèi)的總能量為(4200*75)J,比直接燒開(kāi)所需的(4200*100)J少花費(fèi)了25%的能量。你的任務(wù)是設(shè)計(jì)一個(gè)最佳的操作方案使得n杯水都至少被燒開(kāi)一遍所需的總能量最少。
包含多組測(cè)試數(shù)據(jù)。每組測(cè)試數(shù)據(jù)輸入只有一個(gè)整數(shù)n。(1<=n<=50000)
每組測(cè)試數(shù)據(jù)輸出占一行。輸出n杯水都至少被燒開(kāi)一遍所需的最少的總能量,單位為J,四舍五入到小數(shù)點(diǎn)后兩位
2Sample Output
315000.00分析:題目的輸入為一個(gè)數(shù)n,輸出也為一個(gè)數(shù),很可能涉及到遞推或數(shù)學(xué)公式。通過(guò)計(jì)算,我們可知,第一杯水所需熱量(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<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<string>#include<algorithm>#include<stack>#include<queue>#include<vector>#include<map> using namespace std;int n; int main(){ while( ~scanf("%d",&n)) { double cost = (4200*100.0)/n; double ans = cost; for( int i = 1; i < n; i++) { cost *= (double)(2*i-1)/(double)(2*i); ans += cost; } PRintf("%.2f/n",ans); } return 0;}
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注