传送门

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

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


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

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

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

具体证明:设下一杯水温度为 $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. linux vsftpd 服务配置

    vsftpd.conf配置如下: # Example config file /etc/vsftpd/vsftpd.conf # # The default compiled in settings ...

  2. 8th

    2017-2018-2 20179212<网络攻防实践>第8周作业 视频学习 Kali权限维持之后门 权限维持包含Tunnel工具集.Web后门.系统后门三个子类.其中系统后门与web后门 ...

  3. bzoj 4766: 文艺计算姬 矩阵树定理

    题目: 给定一个一边点数为\(n\),另一边点数为\(m\),共有\(n*m\)条边的带标号完全二分图\(K_{n,m}\) 计算其生成树个数 \(n,m,p \leq 10^{18} ,p为模数\) ...

  4. 洛谷 P4220 & UOJ #347 通道 —— 随机化

    题目:https://www.luogu.org/problemnew/show/P4220 http://uoj.ac/problem/347 先写了一下 n^2 和三棵树一样的情况,n^2 还写了 ...

  5. Python:itertools库的使用

    转于:https://blog.csdn.net/neweastsun/article/details/51965226 博主:neweastsun的专栏 介绍 itertools是python内置的 ...

  6. 二 Akka学习 - actor介绍

    一个actorSystem 是一个重量级的结构.它会分配N个线程.所以对于每一个应用来说只用创建一个ActorSystem. Actor是种可怜的“生物”,它们不能独自存活.Akka中的每一个Acto ...

  7. springMVC绑定json参数之二(2.2.2)

    二.springmvc 接收不同格式的json字符串 2).格式二:json字符串数组 前台: test = function () { var test = ["123",&qu ...

  8. BluetoothSetServiceState 函数

    DWORD BluetoothSetServiceState( HANDLE hRadio, BLUETOOTH_DEVICE_INFO* pbtdi, GUID* pGuidService, DWO ...

  9. window下rails4.1 发生TZInfo::DataSourceNotFound 错误 - smallbottle

    在官网上学习rails 4.1 ,启动rails server之后发生了如下错误 $ rails server Booting WEBrick Rails 4.1.0 application star ...

  10. android activity生命周期的一张经典图片

    图片来自http://blog.csdn.net/android_tutor/article/details/5772285 onpause只有弹出的窗体是Activity的时候才会触发,并非是通过焦 ...