NC13328 倒水
题目
题目描述
有一个大水缸,里面水的温度为 单位,体积为 升。另有 杯水(假设每个杯子的容量是无限的),每杯水的温度为 单位,体积为 升。
现在要把大水缸的水倒入 杯水中,使得 杯水的温度相同,请问这可能吗?并求出可行的最高温度,保留 位小数。
注意:一杯温度为 单位、体积为 升的水与另一杯温度为 单位、体积为 升的水混合后,温度变为 ,体积变为 。
输入描述
第一行一个整数 ,
第二行两个整数 , 其中
接下来 行每行两个整数
输出描述
如果非法,输出“Impossible”(不带引号)否则第一行输出“Possible"(不带引号),第二行输出一个保留 位小数的实数表示答案。
样例解释:往第二杯水中倒 升水
往第三杯水中到 升水
三杯水的温度都变成了
示例1
输入
3 10 2 20 1 25 1 30 1
输出
Possible 20.0000
题解
知识点:贪心,数学。
要使温度都相同,假设所有体积 液体都用上,则有如下等式
现在分三种情况:
- ,因为答案要取大的,根据函数连续性,至少一个点使得 ,因此温度最小值即是答案。
- ,此时 可以直接作为答案。
- ,这种情况不可能。因为温度调整是趋向于 和 之间的但不能达到两端点,如果要使两侧温度向中间靠拢,则必然 ,若 ,则 作为控温端点是无法达到的,即 无法达到;若 ,则必然有一部分 要跨越 ,这也是不可能的。
时间复杂度
空间复杂度
代码
#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; }
本文来自博客园,作者:空白菌,转载请注明原文链接:https://www.cnblogs.com/BlankYang/p/16379768.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧