NC13328 倒水

题目

题目描述

有一个大水缸,里面水的温度为 \(T\) 单位,体积为 \(C\) 升。另有 \(n\) 杯水(假设每个杯子的容量是无限的),每杯水的温度为 \(t[i]\) 单位,体积为 \(c[i]\) 升。

现在要把大水缸的水倒入 \(n\) 杯水中,使得 \(n\) 杯水的温度相同,请问这可能吗?并求出可行的最高温度,保留 \(4\) 位小数。

注意:一杯温度为 \(t_1\) 单位、体积为 \(c_1\) 升的水与另一杯温度为 \(t_2\) 单位、体积为 \(c_2\)升的水混合后,温度变为 \(\frac {t_1c_1+t_2c_2}{c_1+c_2}\) ,体积变为 \(c_1+c_2\)。

输入描述

第一行一个整数 \(n\) , \(1 ≤ n ≤ 10^5\)

第二行两个整数 \(T,C\) , 其中 \(0 ≤ T ≤ 10^4, 0 ≤ C ≤ 10^9\)

接下来 \(n\) 行每行两个整数 \(t[i],c[i]\)

\(0 < t[i], c[i] ≤ 10^4\)

输出描述

如果非法,输出“Impossible”(不带引号)否则第一行输出“Possible"(不带引号),第二行输出一个保留 \(4\) 位小数的实数表示答案。

样例解释:往第二杯水中倒 \(0.5\) 升水

往第三杯水中到 \(1\) 升水

三杯水的温度都变成了 \(20\)

示例1

输入

3
10 2
20 1
25 1
30 1

输出

Possible
20.0000

题解

思路

知识点:贪心,数学。

要使温度都相同,假设所有体积 \(C\) 液体都用上,则有如下等式

\[\frac {t_1c_1+Tc_1'}{c_1+c_1'} = \cdots = \frac {t_nc_n+Tc_n'}{c_n+c_n'} = Ans = \frac {\sum_{i=1}^n t_ic_i + TC}{\sum_{i=1}^n c_i+C}
\]

现在分三种情况:

  1. \(ans \leq \underset{1 \leq i \leq n}{min} \{t_i\}\) ,因为答案要取大的,根据函数连续性,至少一个点使得 \(ans = \underset{1 \leq i \leq n}{min} \{t_i\}\) ,因此温度最小值即是答案。
  2. \(ans \geq \underset{1 \leq i \leq n}{max} \{t_i\}\) ,此时 \(ans\) 可以直接作为答案。
  3. \(\underset{1 \leq i \leq n}{min} \{t_i\} < ans < \underset{1 \leq i \leq n}{max} \{t_i\}\) ,这种情况不可能。因为温度调整是趋向于 \(T\) 和 \(t_i\) 之间的但不能达到两端点,如果要使两侧温度向中间靠拢,则必然 \(\underset{1 \leq i \leq n}{min} \{t_i\} < T < \underset{1 \leq i \leq n}{max} \{t_i\}\) ,若 \(T = ans\) ,则 \(T\) 作为控温端点是无法达到的,即 \(ans\) 无法达到;若 \(T\neq ans\) ,则必然有一部分 \(t_i\) 要跨越 \(T\) ,这也是不可能的。

时间复杂度 \(O(n)\)

空间复杂度 \(O(n)\)

代码

#include <bits/stdc++.h>

using namespace std;

int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n;
cin >> n;
double T, C;
cin >> T >> C;
double maxt = 0, mint = 1e5;
double sum1 = T * C, sum2 = C;///等比定理
for (int i = 0;i < n;i++) {
double t, c;
cin >> t >> c;
maxt = max(maxt, t);
mint = min(mint, t);
sum1 += t * c;
sum2 += c;
}
double ans = sum1 / sum2;
if (ans <= mint) cout << "Possible\n" << fixed << setprecision(4) << mint << '\n';
else if (ans >= maxt) cout << "Possible\n" << fixed << setprecision(4) << ans << '\n';
else cout << "Impossible\n";
return 0;
}

NC13328 倒水的更多相关文章

  1. 广度优先搜索 cdoevs 1226 倒水问题

    cdoevs 1226 倒水问题  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold   题目描述 Description 有两个无刻度标志的水壶,分别可装 x 升 ...

  2. 倒水问题 (codevs 1226) 题解

    [问题描述] 有两个无刻度标志的水壶,分别可装x升和y升 ( x,y 为整数且均不大于100)的水.设另有一水缸,可用来向水壶灌水或接从水壶中倒出的水, 两水壶间,水也可以相互倾倒.已知x升壶为空壶, ...

  3. POJ 3414 Pots【bfs模拟倒水问题】

    链接: http://poj.org/problem?id=3414 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22009#probl ...

  4. yzoi1777倒水问题的详细解法

    Description - 问题描述 x.y.z三个容器,其最大容量分别是xMAX升.yMAX升.zMAX升,这里规定100>xMAX>yMAX>zMAX.一开始x是装满了水的,现在 ...

  5. codevs1226倒水问题(Bfs)

    /* 首先建立模型 可以看成是三个水杯 第三个无穷大 (这里看成是201足够了) 最少步数 想到Bfs 维护队列里的状态:要有个步数 还要有v :此时刻三个杯子有多少水 然后倒水:因为没有刻度 所以有 ...

  6. 倒水问题-->经典面试题目

    题目详细: 有两个容器,容积分别为A升和B升,有无限多的水,现在需要C升水.我们还有一个足够大的水缸,足够容纳C升水.起初它是空的,我们只能往水缸里倒入水,而不能倒出.可以进行的操作是:把一个容器灌满 ...

  7. 倒水问题 (FillUVa 10603) 隐式图

    题意:本题的题意是给你三个杯子,第一二个杯子是空的,第三个杯子装满水,要求是量出一定容量d升的水.若是得不到d升的水,那就让某一个杯子里面的水达到d',使得d'尽量接近d升. 解题思路:本题是给出初始 ...

  8. uva10603 倒水问题

    状态搜索.类似八数码问题 AC代码 #include<cstdio> #include<queue> #include<cstring> #include<a ...

  9. 美团codeM预赛A轮 倒水

    [编程题] 倒水 时间限制:1秒 空间限制:32768K 有一个大水缸,里面水的温度为T单位,体积为C升.另有n杯水(假设每个杯子的容量是无限的),每杯水的温度为t[i]单位,体积为c[i]升. 现在 ...

随机推荐

  1. Luffy /3/ 前台主页搭建&轮播图接口

    目录 前台主页搭建 components/Homeviwe.vue components/Banner.vue components/Header.vue components/Footer.vue ...

  2. 面试突击42:synchronized和ReentrantLock有什么区别?

    在 Java 中,常用的锁有两种:synchronized(内置锁)和 ReentrantLock(可重入锁),二者的功效都是相同得,但又有很多不同点,所以我们今天就来聊聊. 区别1:用法不同 syn ...

  3. 攻防世界-MISC:Training-Stegano-1

    这是攻防世界高手进阶区的题目,题目如下: 点击下载附件一,得到一张bmp图片 尝试用stegslove打开,并没有得到什么有用的信息,用010editor打开,发现文件后面有一串字符串 尝试提交fla ...

  4. 《HelloGitHub》第 73 期

    兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. https://github.com/521xueweiha ...

  5. 软件开发架构,网络编程简介,OSI七层协议,TCP和UDP协议

    软件开发架构 什么是软件开发架构 1.软件架构是一个系统的草图. 2.软件架构描述的对象是直接构成系统的抽象组件. 3.各个组件之间的连接则明确和相对细致地描述组件之间的通讯. 4.在实现阶段,这些抽 ...

  6. (数据科学学习手札136)Python中基于joblib实现极简并行计算加速

    本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 我们在日常使用Python进行各种数据计算 ...

  7. 无线:PIN码

    PIN码(PIN1),全称Personal Identification Number.就是SIM卡的个人识别密码.手机的PIN码是保护SIM卡的一种安全措施,防止别人盗用SIM卡,如果启用了开机PI ...

  8. 【FineBI】FineBI连接阿里云mysql教程

    因为某些原因需要查看数据信息,之前连接成功一次,今天软件更新了以后发现连接信息丢. 又重新折腾了一下. 主要有2个地方: 1.查看阿里云数据库外网连接地址:打开云数据库RDS-实例列表-管理-数据库连 ...

  9. mui|mui.plusReady里面的函数不执行??

    无论是在本地的浏览器还是在iPhone上真机运行都出现奇怪的错误,比如说子页面样式成为乱码,无法跳转子页面等等,一开始并没有意识到是mui.plusReady的问题,后来调试时发现是plusReady ...

  10. 前端 关于请求地址时出现乱码, 出现%E2%80%8B的问题

    做项目时,添加了新的一个接口,习惯性地复制了接口下来.然后测试发现 请求时自动添加 了几个%E2%80%8B这种乱码. 问题原因: 我输出请求地址时也是正确的,是因为复制过来的接口地址会有零宽空格 解 ...