CF126A
Hot Bath 题解
题目简述
这是一个简单的数学推理题。我们需要找到两个龙头的流速
-
最终水温不低于
; -
在满足上一条的前提下,水温尽可能接近
; -
在满足上一条的前提下,总流速尽可能大。
思路实现
根据题目描述,我们可以得出以下结论:
-
如果
,那么只需打开冷水龙头即可,此时 取最大值 , 取 0。 -
如果
,那么只需打开热水龙头即可,此时 取 0, 取最大值 。
接下来我们考虑
-
打开冷水龙头,关闭热水龙头:此时只需调节冷水龙头的流速
。根据公式 ,我们可以得到此时的水温。如果水温小于 ,则继续减小 的值;如果水温大于等于 ,则记录下此时的流速和水温差。 -
打开热水龙头,关闭冷水龙头:此时只需调节热水龙头的流速
。根据公式 ,我们可以得到此时的水温。如果水温大于 ,则继续增大 的值;如果水温小于等于 ,则记录下此时的流速和水温差。
最后,我们从两个子问题中找到水温差最小的情况即可。
Code:
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
long long t1, t2, x1, x2, t0;
cin >> t1 >> t2 >> x1 >> x2 >> t0;
double minDiff = 1e9; // 记录水温差的最小值
pair<int, int> ans; // 记录结果
// 子问题一:打开冷水龙头,关闭热水龙头
for (int y1 = x1; y1 >= 0; y1--) {
double temp = t1 * y1 / (double)y1; // 计算水温
if (temp < t0) {
break; // 水温小于 t0,继续减小 y1 的值
}
if (temp - t0 < minDiff) {
minDiff = temp - t0;
ans = make_pair(y1, 0);
}
}
// 子问题二:打开热水龙头,关闭冷水龙头
for (int y2 = x2; y2 >= 0; y2--) {
double temp = t2 * y2 / (double)y2; // 计算水温
if (temp >= t0) {
break; // 水温大于等于 t0,继续增大 y2 的值
}
if (t0 - temp < minDiff) {
minDiff = t0 - temp;
ans = make_pair(0, y2);
}
}
cout << ans.first << " " << ans.second << endl;
return 0;
}
该解法的时间复杂度为
本文来自一名初中牲,作者:To_Carpe_Diem
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· Apache Tomcat RCE漏洞复现(CVE-2025-24813)