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. 论文解读(SelfGNN)《Self-supervised Graph Neural Networks without explicit negative sampling》

    论文信息 论文标题:Self-supervised Graph Neural Networks without explicit negative sampling论文作者:Zekarias T. K ...

  2. MySQL免安装版发生系统错误 1067

    使用MySql免安装版启动时1067 解决办法 打开安装的文件夹 找到my.ini的mysqld模块,调整参数位置. 3. 重新启动Mysql服务 net start mysql

  3. Solon 1.7 重要发布,更现代感的应用开发框架

    相对于 Spring Boot 和 Spring Cloud 的项目 启动快 5 - 10 倍 qps 高 2- 3 倍 运行时内存节省 1/3 ~ 1/2 打包可以缩小到 1/2 ~ 1/10(比如 ...

  4. 1.12 Linux已经霸占了服务器领域!

    如今的 IT 服务器领域是 Linux.UNIX.Windows 三分天下,Linux 系统可谓后起之秀,特别是"互联网热"以来,Linux 在服务器端的市场份额不断扩大,每年增长 ...

  5. dubbo发送过程编码失败,会唤醒发送线程吗?

    dubbo发送过程编码失败,会唤醒发送(客户端业务)线程吗?如何实现的? 在上篇文章 dubbo坑- No provider available for the service xxx 中,如果dub ...

  6. SICP 2.2: 层次性数据和闭包性质(Python实现)

    绪论 序对可以为我们提供用于构造复合数据的基本"粘接剂",鉴于Python中tuple中元素不可变的性质,我们通过list来实现序对,如[1, 2].Python的PyListOb ...

  7. 让服务调用更简单 - Caller.HttpClient

    前言 绝大多数项目都离不开服务调用,服务的调用方式通常是基于Http.RPC协议的调用,需要获取到对应服务的域名或者ip地址以及详细的控制器方法后才能进行调用,如果项目需要支持分布式部署,则需要借助服 ...

  8. 923. 3Sum With Multiplicity - LeetCode

    Question 923. 3Sum With Multiplicity Solution 题目大意: 给一个int数组A和一个目标值target,求满足下面两个条件的组合个数,其中i,j,k分别为数 ...

  9. 目标检测复习之Anchor Free系列

    目标检测之Anchor Free系列 CenterNet(Object as point) 见之前的过的博客 CenterNet笔记 YOLOX 见之前目标检测复习之YOLO系列总结 YOLOX笔记 ...

  10. poj1475 -- Pushing Boxes

    这道题其实挺有趣 的,这让我想起小时候诺基亚手机上的推箱子游戏(虽然一点也不好玩) (英文不好-->)  题意翻译: 初始人(S),箱子(B),目的地(T)用人把箱子推到 T最小步数及其路径(满 ...