传送门

我见过的第二恶心的题,第一是糖果传递...

以下是一堆具体的证明,自己想的,可能考虑不周,不想看也可以直接看结论


首先有一个很显然的贪心,烧开的水要尽量把热量传递出去

所以有一个比较显然的方法:每杯水烧开后都与下一杯水热传递,平衡后再把剩下的温度与更后面一杯水热传递,这样一直下去...

十分显然把热量传递出去比不传递出去要更优

具体证明:设下一杯水温度为 $t_1$,此时上一杯水已经烧开,为$t_{max}$

如果它们之间进行热传递,那么下一杯水的热量就变成 $\frac{t_1+t_{max}}{2}$

显然温度会更高,所以烧开所需热量更少,答案会更优,并且可以容易推广到多杯水的情况

然后热量传出去了,按什么顺序烧开他们也是关键

方法:把温度从大到小排序,优先烧温度大的水再把热量传下去会更优

证明:设第一杯水温度为 $t_1$ ,第二杯水温度为 $t_2$,且 $t_1>t_2$

如果我们先烧第一杯水,那么需要升高的温度为 $t_{max} - t_1$

然后第一杯水烧开后再把热量传给第二杯水,第二杯水温度变成 $\frac{t_2+t_{max}}{2}$

把第二杯水烧开需要升高的温度为 $t_{max} - \frac{t_2+t_{max}}{2}$

因为水质量一样,所以升高的温度可以直接相加,化简得$\frac{3}{2}t_{max} - t_1 -\frac{t_2}{2}$

因为水的质量一样,所以温度的升高多少就相当于热量的消耗多少

如果我们先烧第二杯水再传温度给第一杯水再烧第一杯水

经过同样的方法可以算出总共升高的温度为$\frac{3}{2}t_{max} - t_2 -\frac{t_1}{2}$

因为 $t_1>t_2$ ,所以第一种方案更优,此结论用同样的方法也能推广到多杯水的情况


所以总结一下,就是优先烧温度大的水,然后把热量尽量传出去

知道了方案,每杯水消耗的热量自己找找规律就出来了

设 $f_n$ 表示第 n 杯水烧开消耗的热量

那么 $f_n=f_{n-1}*[1-\frac{1}{2}(n-1)]$

代码不解释

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
int n;
double ans,now=420000.0;
int main()
{
n=read(); now/=n;
for(int i=;i<=n;i++) ans+=now,now*=(-0.5/i);
printf("%.2lf",ans);
return ;
}

P1984 [SDOI2008]烧水问题(具体证明)的更多相关文章

  1. 洛谷P1984 SDOI2008烧水问题

    P1984 [SDOI2008]烧水问题 186通过 438提交 题目提供者lych 标签数论(数学相关)模拟各省省选 难度普及+/提高 提交该题 讨论 题解 记录 最新讨论 求助! 也是醉了... ...

  2. 洛谷 P1984 [SDOI2008]烧水问题 解题报告

    P1984 [SDOI2008]烧水问题 题目描述 把总质量为1kg的水分装在n个杯子里,每杯水的质量均为(1/n)kg,初始温度均为0℃.现需要把每一杯水都烧开.我们可以对任意一杯水进行加热.把一杯 ...

  3. 洛谷 P1984 [SDOI2008]烧水问题

    洛谷 P1984 [SDOI2008]烧水问题 题目描述 把总质量为1kg的水分装在n个杯子里,每杯水的质量均为(1/n)kg,初始温度均为0℃.现需要把每一杯水都烧开.我们可以对任意一杯水进行加热. ...

  4. P1984 [SDOI2008]烧水问题

    题目描述 把总质量为1kg的水分装在n个杯子里,每杯水的质量均为(1/n)kg,初始温度均为0℃.现需要把每一杯水都烧开.我们可以对任意一杯水进行加热.把一杯水的温度升高t℃所需的能量为(4200*t ...

  5. [SDOI2008]烧水问题

    题目描述 把总质量为1kg的水分装在n个杯子里,每杯水的质量均为(1/n)kg,初始温度均为0℃.现需要把每一杯水都烧开.我们可以对任意一杯水进行加热.把一杯水的温度升高t℃所需的能量为(4200*t ...

  6. 洛谷1984 [SDOI2008]烧水问题

    一道找规律 原题链接 显然要将烧得的温度最大化利用,即每次都去热传递. 设水沸腾为\(x\). 第一杯直接烧水,需提高\(x\). 第二杯先与第一杯进行热传递,这样只需提高\(\dfrac{x}{2} ...

  7. [SDOI2008]烧水问题 规律

    题目描述 把总质量为1kg的水分装在n个杯子里,每杯水的质量均为(1/n)kg,初始温度均为0℃.现需要把每一杯水都烧开.我们可以对任意一杯水进行加热.把一杯水的温度升高t℃所需的能量为(4200*t ...

  8. luogu1984 [SDOI2008] 烧水问题

    题目描述 给出水的比热容.冰点和沸点,问将$n$杯有$\frac{1}{n}\mathrm{kg}$的水从冰点加热到沸点所需最小热量.不一定相邻的两杯水间可以无热量损失地热传递至两者温度相同. 题解 ...

  9. 洛谷 1984 [SDOI2008]烧水问题

    [题解] 烧开每一杯水之后都用它去把其他没烧开的水焐热,这样显然是最优的.然后推推式子或者列表找规律就好了. #include<cstdio> #include<algorithm& ...

随机推荐

  1. 【Caffe】Ubuntu 安装 Caffe gpu版

    安装环境:Ubuntu 16.04lts 64位, gcc5.4 gpu1050ti,cuda8.0,cudnn5.1.10 1. 安装依赖库 sudo apt-get install libprot ...

  2. css 更换浏览器 默认图标

    cursor:url("./images/test.cur"),auto; 只在chrome测试过...

  3. BZOJ1206:[HNOI2005]虚拟内存

    我对模拟的理解:https://www.cnblogs.com/AKMer/p/9064018.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem ...

  4. live555源代码分析

    live555源代码下载(VC6工程):http://download.csdn.net/detail/leixiaohua1020/6374387 liveMedia 项目(http://www.l ...

  5. K Sum(2 Sum,3 Sum,4 Sum,3-Sum Closest)

    算是经典算法问题了.这里主要针对只存在一个解或者只需要求一个解的情况描述一下解题思路.若需要找到所有可能解,方法需要略作调整.如有问题,欢迎指正. 2 sum: 如果已排序,可直接用夹逼法,即两指针从 ...

  6. python version 2.7 required,which was not found in

    python version 2.7 required,which was not found in 出现上面这种情况的原因我推测有两种: 1.NumPy和SciPy官方网站上只提供了32bit的文件 ...

  7. Devexpress GridControl

    1.隐藏“Drag a column header here to group by that column”如下: 选择gridview->属性 选择OptionView->ShowGr ...

  8. C# 判断路径和文件存在

    1.判断路径是否存在,不存在则创建路径: if (!System.IO.Directory.Exists(@"D:\Export")) { System.IO.Directory. ...

  9. C笔试题(二)

    /* 现在有一个数组 我们可以定义数组的子数组 如 数组 1 3 4 2 5 8 7 它的子数组可以是 1 3 4 3 4 2 5 等等 请写一个算法 找一个子数组 这个子数组递增不减少 并且是满足递 ...

  10. 如何在niosII中添加i2c外设_winday_新浪博客

    如何在niosII中添加i2c外设_winday_新浪博客 如何在niosII中添加i2c外设 winday 摘要:本文说明了如何在niosII添加第三方i2c外设,以供参考. 由于本人使用的Alte ...