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. Handler异步通信系统

    handler是Android给我们提供用来更新UI的一套机制,也是一套消息处理机制,我们可以发消息,也可以通过它处理消息. Handler机制主要的几个角色:Handler,Message,Loop ...

  2. Day 004:PAT练习--1033 旧键盘打字 (20 分)

    题目要求如下:   我一开始理解的题意:第一行给出的是坏掉的键,这里的规则应该是这样的:   1."对应英文字母的坏键以大写给出",若有字母,则与其相关的字母全部不能输出,不论是大 ...

  3. 【Java分享客栈】我曾经的两个Java老师一个找不到工作了一个被迫转行了

    前言 写这篇文章的初衷主要是最近发生了两件事,让我感慨良多,觉得踏入这个行业的初始,有些事情就应该长远考虑,这样对职业发展才更有利,仅仅停留在技术的追求上固然能壮大自身,可逆水行舟的程序员们终究会面临 ...

  4. python基础-基本数据类型(二)

    一.序列类型 序列类型是用来表示有序的元素集合 1.字符串(str) python中字符串通常用str表示,字符串是使用单引号,双引号,三引号包裹起来的字符的序列,用来表示文本信息. 1.1 字符串的 ...

  5. python自动化测试工具selenium使用指南

    概述 selenium是网页应用中最流行的自动化测试工具,可以用来做自动化测试或者浏览器爬虫等.官网地址为:https://www.selenium.dev/.相对于另外一款web自动化测试工具QTP ...

  6. Lab_1:练习1——理解通过make生成执行文件的过程

    lab_0 清华大学ucore实验环境配置详细步骤!(小白入) lab_1 清华大学ucore bootload启动ucore os(预备知识) Lab_1:练习1--理解通过make生成执行文件的过 ...

  7. 为什么建议大家使用 Linux 开发?

    关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ Linux 能用吗? 我身边还有些朋友对 linux 的印象似乎还停留在黑乎乎的命令行界面上. ...

  8. js运算符、 流程控制 、函数、内置对象、BOM与DOM操作

    运算符 # 1.算术运算符 var x=10; var res1=x++; '先赋值后自增1' var res2=++x; '先自增1后赋值' # 2.比较运算符 弱等于:自动转换类型 '5' == ...

  9. Spring Boot整合模板引擎freemarker

    jsp本质是servlet,渲染都在服务器,freemarker模板引擎也是在服务器端渲染. 项目结构 引入依赖pom.xml <!-- 引入 freemarker 模板依赖 --> &l ...

  10. debconf-utils-交互式安装时预配置

    debconf-utils是一个可以在Ubuntu下预先配置要安装程序的小工具,它可以避免在安装一个DEB程序时的弹窗输入问题,这可能在编写一键部署脚本的时候非常有用. 以下我们用安装MySQL-AP ...