注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

TsReaper的博客

一起来玩算法竞赛吧~

 
 
 
 
 

日志

 
 

[题解]烧水问题  

2015-08-14 21:54:42|  分类: 题解 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
关键字:找规律。

Link&Limit


        [洛谷1984]  [codevs1841]
        时间限制:1000ms  空间限制:131072kb

Description


        (问题描述略有简略)
        现有n杯水,总质量为1kg,初温均为0,现要把每一杯水都烧开。我们可以对任意一杯水加热,把这杯水的水温升高t摄氏度的能量为4200*t/n J。每杯水的温度最高为100度,如果达到了,则视为该杯水已经被烧开。
        我们还可以进行热传导,若一杯水的温度为a,另一杯为b,则我们可以用0 J将这两杯水都变为(a+b)/2度。现在假设没有其他影响,求将这n杯水都烧开一遍至少需要能量?

Input Format


        一个数n.

Output Format


        一个数,最少的能量.

Sample Input #1


2

Sample Output #1


315000.00

Hint


        1<=n<=3000000
        样例解释:现将第一杯烧开,花费210000.00 J,然后热传导,第二杯为50度,最后把第二杯也烧开,花费105000.00 J,所以共花费315000.00J
        答案保留两位小数。

        显然水烧开以后,要尽量把含有的能量传给其它没有烧开的水,结果才会优。设把一杯水从0度烧开所需要的能量为1,那么烧开第二杯水的能量为1-1/2 = 1/2(第一杯水烧开后,传热给第二杯水),烧开第三杯水的能量为1-(1+1/4)/2 = 3/8(第一杯水传热给第三杯,第二杯也传热)......这样我们写出烧开前几杯水所需要的能量:1,1/2,3/8,5/16......显然可以看出第i个数为1*1/2*3/4*...*((i-1)*2-1)/(i-1)*2,按照规律计算即可。

#include <stdio.h>
int n;
double ans;
int main()
{
int i,j;
double t;
scanf("%d",&n);
ans = t = 420000.0/n;
for(i=j=2;i<=n;i++,j+=2) ans += (t*=(double)(j-1)/j);
printf("%.2f",ans);
return 0;
}

  评论这张
 
阅读(16)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018