P1984 [SDOI2008]烧水问题

题目描述

把总质量为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

很明显存在着规律:

  设第一杯水加热到100摄氏度,需要加热A。f[1]=A

  则第二杯能从第一杯中获得A/2.f[2]=A/2

  第三杯能从第一杯获得A/(2^2),从第二杯获得A/2.f[3]=A/(2^2)

                       f[i]=A/( (i-1) ^2).

  规律就来了.

#include<iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
int main()
{
    int n;
    double ans=0.00,now;
    now=420000.000;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        ans+=now;
        now=now*(double )( i*2-1 ) /( i*2 );
    }
    ans=ans/n;
    printf("%.2lf",ans);
    return 0;
}
时间: 2024-08-24 22:06:42

P1984 [SDOI2008]烧水问题的相关文章

洛谷P1984 SDOI2008烧水问题

P1984 [SDOI2008]烧水问题 186通过 438提交 题目提供者lych 标签数论(数学相关)模拟各省省选 难度普及+/提高 提交该题 讨论 题解 记录 最新讨论 求助! 也是醉了... 题目有问题 这个不是SDOI的题吧... 这是什么???? 题目描述 把总质量为1kg的水分装在n个杯子里,每杯水的质量均为(1/n)kg,初始温度均为0℃.现需要把每一杯水都烧开.我们可以对任意一杯水进行加热.把一杯水的温度升高t℃所需的能量为(4200*t/n)J,其中,“J”是能量单位“焦耳”

[SDOI2008]烧水问题

洛谷P1984 [SDOI2008]烧水问题 题目描述 把总质量为1kg的水分装在n个杯子里,每杯水的质量均为(1/n)kg,初始温度均为0℃.现需要把每一杯水都烧开.我们可以对任意一杯水进行加热.把一杯水的温度升高t℃所需的能量为(4200*t/n)J,其中,"J"是能量单位"焦耳".如果一旦某杯水的温度达到100℃,那么这杯水的温度就不能再继续升高,此时我们认为这杯水已经被烧开.显然地,如果直接把水一杯一杯地烧开,所需的总能量为(4200*100)J. 在烧水的

LUOGU 1984: [SDOI2008]烧水问题 数论递推

title LUOGU 1984 Description: 把总质量为 1 kg 的水分装在 n 个杯子里,每杯水的质量均为 (1/n)kg,初始温度均为0℃.现需要把每一杯水都烧开.我们可以对任意一杯水进行加热.把一杯水的温度升高 t℃ 所需的能量为 (4200 * t/n) J,其中,"J"是能量单位"焦耳".如果一旦某杯水的温度达到 100℃ ,那么这杯水的温度就不能再继续升高,此时我们认为这杯水已经被烧开.显然地,如果直接把水一杯一杯地烧开,所需的总能量为

题解:[SDOI2008]烧水问题

思维题 其实就是找个规律 其实类似于贪心,把一杯水的热量尽量全部传递, 一步一步往后退可得到需要加热的为t(n+1)/t(n)=1-1/2n 1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 using namespace std; 5 int n; 6 int main(){ 7 scanf("%d",&n); 8 double ans, now; 9 now=42000

BZOJ 3229: [Sdoi2008]石子合并

3229: [Sdoi2008]石子合并 时间限制: 3 Sec  内存限制: 128 MB提交: 497  解决: 240[提交][][] 题目描述 在一个操场上摆放着一排N堆石子.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分. 试设计一个算法,计算出将N堆石子合并成一堆的最小得分. 输入 第一行是一个数N. 以下N行每行一个数A,表示石子数目. 输出 共一个数,即N堆石子合并成一堆的最小得分. 样例输入 4 1 1 1 1 样

bzoj2186【SDOI2008】沙拉公主的困惑

2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 2363  Solved: 779 [Submit][Status][Discuss] Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票.房地产第一大户沙拉公主决定预测一下大富翁国现在所有真钞票的数量.现在,请你帮助沙拉公主解决这个问题,由于可能张

bzoj2190 [SDOI2008]仪仗队

2190: [SDOI2008]仪仗队 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 3353  Solved: 2168[Submit][Status][Discuss] Description 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图).    现在,C君希望你告诉他队伍整齐时能看到的学生人数.

bzoj 2190: [SDOI2008]仪仗队.

2190: [SDOI2008]仪仗队 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 3240  Solved: 2092[Submit][Status][Discuss] Description 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图).现在,C君希望你告诉他队伍整齐时能看到的学生人数. Inp

BZOJ 4698: Sdoi2008 Sandy的卡片

4698: Sdoi2008 Sandy的卡片 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 225  Solved: 95[Submit][Status][Discuss] Description Sandy和Sue的热衷于收集干脆面中的卡片.然而,Sue收集卡片是因为卡片上漂亮的人物形象,而Sandy则是为了积 攒卡片兑换超炫的人物模型.每一张卡片都由一些数字进行标记,第i张卡片的序列长度为Mi,要想兑换人物模型 ,首先必须要集够N张卡片,对