题目描述

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

首先要明确的一点是:

尽可能多的使用能量(不浪费);

对于第一个杯子,我们依次与2,3,...,n均分;

接着将2烧开,用2与3,4,...,n均分;

就ok了;

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<bitset>
#include<ctime>
#include<deque>
#include<stack>
#include<functional>
#include<sstream>
//#include<cctype>
//#pragma GCC optimize(2)
using namespace std;
#define maxn 1000005
#define inf 0x7fffffff
//#define INF 1e18
#define rdint(x) scanf("%d",&x)
#define rdllt(x) scanf("%lld",&x)
#define rdult(x) scanf("%lu",&x)
#define rdlf(x) scanf("%lf",&x)
#define rdstr(x) scanf("%s",x)
typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int U;
#define ms(x) memset((x),0,sizeof(x))
const long long int mod = 1e9 + 7;
#define Mod 1000000000
#define sq(x) (x)*(x)
#define eps 1e-4
typedef pair<int, int> pii;
#define pi acos(-1.0)
//const int N = 1005;
#define REP(i,n) for(int i=0;i<(n);i++)
typedef pair<int, int> pii;
inline ll rd() {
ll x = 0;
char c = getchar();
bool f = false;
while (!isdigit(c)) {
if (c == '-') f = true;
c = getchar();
}
while (isdigit(c)) {
x = (x << 1) + (x << 3) + (c ^ 48);
c = getchar();
}
return f ? -x : x;
} ll gcd(ll a, ll b) {
return b == 0 ? a : gcd(b, a%b);
}
int sqr(int x) { return x * x; } /*ll ans;
ll exgcd(ll a, ll b, ll &x, ll &y) {
if (!b) {
x = 1; y = 0; return a;
}
ans = exgcd(b, a%b, x, y);
ll t = x; x = y; y = t - a / b * y;
return ans;
}
*/ int n;
double ans; int main() {
//ios::sync_with_stdio(0);
cin >> n;
if (n == 1) {
ans = 4200 * 100.0;
printf("%.2lf\n", 1.0*ans);
return 0;
}
ans += 4200 * 100.0 / n;
double t = 1.0;
double cost = 4200 * 100.0 / n;
for (int i = 2; i <= n; i++) {
t = t * (1 - 0.5 / ((i - 1)));
ans += t * cost*1.0;
}
printf("%.2lf\n", 1.0*ans);
}

最新文章

  1. HTML5 Boilerplate - 让页面有个好的开始
  2. js 小工具-- 原生 js 去除空格
  3. 3种用组策略将域帐号加入本地管理员组的方法_jinifly_新浪博客
  4. ASP.NET文章目录导航
  5. [LeetCode#202] Roman to Integer
  6. 一步一步教你做ios推送
  7. 一步一步学python(三) - 使用字符串
  8. vue小白必看的生命钩子函数图解
  9. 纯css3单选框/复选框美化样式代码
  10. Spring Boot 1.5升级2.1 主要问题汇总
  11. 一、Tableau基础
  12. 《生命》第一集:Chanllenge of Life (生命的挑战)
  13. mysql 查询结果集按照指定的字段值顺序排序
  14. Luogu1081 NOIP2012 开车旅行 倍增
  15. Caddy – 方便够用的 HTTPS server 新手教程
  16. 基于 Python 和 Pandas 的数据分析(1)
  17. [HDU1890]RoboticSort
  18. LINUX内核完全注释
  19. 动态规划-----hdu 1024 (区间连续和)
  20. Oracle_高级功能(9) 性能优化

热门文章

  1. jQuery UI vs Kendo UI &amp; jQuery Mobile vs Kendo UI Mobile
  2. Java 的标识符
  3. ASP.NET——配置文件——连接字符串
  4. App启动原理和启动过程
  5. java获取Linux持续运行时间及友好显示
  6. apache2不识别php
  7. Ubuntu14.04 安装Source Insight
  8. this、new、call和apply的相关问题
  9. Angular问题02 创建模块失败、 angular-cli名称问题、升级angular-cli
  10. MySQL中的时间问题