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. git详情、git工作流程、常用命令、忽略文件、分支操作、gitee远程仓库使用

    今日内容概要 git详情 git工作流程 git常用命令 过滤文件 分支操作 git远程仓库使用 可参照:https://www.cnblogs.com/liuqingzheng/p/15328319 ...

  2. 【Hadoop】ZooKeeper组件

    目录 一.配置时间同步 二.部署zookeeper(master节点) 1.使用xftp上传软件包至~ 2.解压安装包 3.创建 data 和 logs 文件夹 4.写入该节点的标识编号 5.修改配置 ...

  3. js归并排序实现

    let arr = [3,4,2,8,1,1,2,2,3,3,4,5]; const merge = function(L,M,R) { let arr2=[]; let i=0; let p1 = ...

  4. Java 15 新特性:文本块

    大家好,我是DD,今天继续来学点Java的新特性! 假设有这样一个场景,我们需要做一个工具.用来自动生成项目文档,文档可以通过浏览器查看,所以最后产出物肯定是一堆html文件.为了让这些html文件更 ...

  5. 【面试普通人VS高手系列】Spring中事务的传播行为有哪些?

    一个工作了2年的粉丝,私信了一个比较简单的问题. 说: "Spring中事务的传播行为有哪些?" 他说他能记得一些,但是在项目中基本上不需要配置,所以一下就忘记了. 结果导致面试被 ...

  6. re模块,正则表达式起别名和分组机制,collections模块,time与datetime模块,random模块

    re模块和正则表达式别名和分组机制 命名分组 (1)分组--可以让我们从文本内容中提取指定模式的部分内容,用()来表示要提取的分组,需要注意的是分组 是在整个文本符合指定的正则表达式前提下进行的进一步 ...

  7. 请求扩展、蓝图、g对象

    今日内容概要 请求扩展 蓝图 g对象 内容详细 1.请求扩展 # 在请求来了,请求走了,可以做一些校验和拦截,通过装饰器来实现 7 个 # 1 before_request 类比django中间件中的 ...

  8. 软件项目管理 ——1.2.PMBOK与软件项目管理知识体系

    软件项目管理 --1.2.PMBOK与软件项目管理知识体系 归档于软件项目管理初级学习路线 第一章 软件项目管理基本概念 <初级学习路线合集 > @ 目录 软件项目管理 --1.2.PMB ...

  9. @ConfigurationProperties(prefix = "server-options") 抛出 SpringBoot Configuration Annotation Processor not configured 错误

    说明 spring-boot-configuration-processor 包的作用是自动生成 META-INF/spring-configuration-metadata.json 文件,而这个 ...

  10. 【freertos】008-内存管理

    前言 本章主要讲解内部存储空间(RAM)的管理. 详细分析heap5方案. 参考: 李柱明博客 https://freertos.blog.csdn.net/article/details/51606 ...