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


    P1984 [SDOI2008]烧水问题

    题目描述

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

    在烧水的过程中,我们随时可以在两杯温度不同的水之间进行热传递操作。热量只能从温度较高的那杯水传递到温度较低的那杯水。由于两杯水的质量相同,所以进行热传递操作之后,原来温度较高的那杯水所降低的温度总是等于原来温度较低的那杯水所升高的温度。

    一旦两杯水的温度相同,热传递立刻停止。

    为了把问题简化,我们假设:

    1、没有进行加热或热传递操作时,水的温度不会变化。

    2、加热时所花费的能量全部被水吸收,杯子不吸收能量。

    3、热传递总是隔着杯子进行,n杯水永远不会互相混合。

    4、热传递符合能量守恒,而且没有任何的热量损耗。

    在这个问题里,只要求把每杯水都至少烧开一遍就可以了,而不要求最终每杯水的温度都是100℃。我们可以用如下操作把两杯水烧开:先把一杯水加热到100℃,花费能量(4200100/2)J,然后两杯水进行热传递,直到它们的温度都变成50℃为止,最后把原来没有加热到100℃的那杯水加热到100℃,花费能量(420050/2)J,此时两杯水都被烧开过了,当前温度一杯100℃,一杯50℃,花费的总能量为(420075)J,比直接烧开所需的(4200100)J少花费了25%的能量。

    你的任务是设计一个最佳的操作方案使得n杯水都至少被烧开一遍所需的总能量最少。

    输入输出格式

    输入格式:

    输入文件只有一个数n。

    输出格式:

    输出n杯水都至少被烧开一遍所需的最少的总能量,单位为J,四舍五入到小数点后两位。

    说明

    1≤n≤50000


    我真的不会找规律,找不出来也不会证,根本没什么导向性要往那想,没救了。

    有一个贪心比较显而易见,每次一个烧开以后优先和当前温度高的做热传递,并依次传递下去。

    然后模拟前几次的状态

    1 2 3 4 5 当前消耗:

    1 1/2 1/4 1/8 1/16 ... 1

    1 1 5/8 3/8 7/32 ... 1/2

    1 1 1 11/16 29/64 ... 5/16

    1 1 1 1 93/128 ... 35/128

    对当前消耗前后作商,得到规律(T_{n+1}=T_n*(1-1/2*n))

    我根本不会往作商想,想了也不会找到递推式子。。。没救了怎么办啊。。。


    2018.6.16

  • 相关阅读:
    SQLite 版本引发的 Python 程序调用问题
    从0到10亿,微信后台架构及基础设施设计与实践!
    从Oracle到PostgreSQL:动态性能视图 vs 标准统计视图
    第一章 准备工作
    Swagger2简介
    如何查询numpy,scipy,matplotlib等的版本和安装位置
    完美解决ImportError: cannot import name '_validate_lengths'报错问题
    完美解决AttributeError: module 'scipy.misc' has no attribute 'imread'报错问题
    线上课堂:ernetes Operator开发范式
    Bomb Enemy 炸弹人
  • 原文地址:https://www.cnblogs.com/butterflydew/p/9190633.html
Copyright © 2020-2023  润新知