C++编程实现:浴缸水温控制算法
C++编程实现:浴缸水温控制算法
小码哥家里的浴缸有一个冷水龙头和一个热水龙头,流出的水温分别是t1和t2; 它们的流速最大是每秒x1和x2个单位,并且可以调节到0至最大流速间的任意一个整数速度。假如两个龙头的流速分别是y1和y2(0≤y≤10),那么最终的水温就是t = (t1 * y1 + t2 * y2) / (y1 + y2)。
现在,小码哥请你帮忙安排两个水龙头的流速,满足:
- 最终水温不低于to;
- 在满足上一条的前提下,水温尽可能接近t;
- 在满足上一条的前提下,总流速尽可能大。
输入格式:
一行五个整数t1,t2,x1,x2,to; 其中: 1<t1≤to<t2<106,1<=x1,x2<106
输出格式:
输出一行两个数表示最终的总流速和流速比例。
思路:
二分答案 + 贪心 因为要求流速尽可能大,所以我们可以考虑二分总流速和总流速中冷水和热水的流速比例,然后再根据当前比例求出两个龙头的流速,判断能否满足条件。
对于比例 r = y1 / y2,我们可以枚举分子和分母,然后计算出当前比例 r',如果 r' > r,则说明分子过小,需要增大;否则说明分母过小,需要减小。这样就能得到合适的流速比例。
然后再根据比例,求出两个龙头的流速,判断是否能够满足条件。具体来说,对于每个流速比例 r,我们可以通过以下步骤来判断是否能够满足条件:
- 根据 r 求出两个龙头的流速 y1, y2;
- 根据 y1, y2 求出最终水温 t;
- 如果 t >= to,则说明当前比例可以满足条件,将总流速与当前比例分别更新为当前值;
- 否则,如果 t < to,则说明当前比例不可行,需要尝试更大的比例。
最后输出更新后的总流速与比例即可。
代码:
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int t1, t2, x1, x2, to;
cin >> t1 >> t2 >> x1 >> x2 >> to;
int max_flow = 0; // 最大总流速
double best_ratio = 0.0; // 最佳流速比例
// 二分总流速
for (int flow = 1; flow <= x1 + x2; flow++) {
// 二分流速比例
for (int y1 = 0; y1 <= x1; y1++) {
for (int y2 = 0; y2 <= x2; y2++) {
if (y1 + y2 != flow) continue;
double ratio = (double)y1 / y2;
if (ratio > best_ratio) {
// 计算当前水温
double cur_temp = (double)(t1 * y1 + t2 * y2) / (y1 + y2);
if (cur_temp >= to) {
max_flow = flow;
best_ratio = ratio;
}
}
}
}
}
cout << max_flow << ' ' << best_ratio << endl;
return 0;
}
原文地址: https://www.cveoy.top/t/topic/lPnC 著作权归作者所有。请勿转载和采集!