-
问题链接:
POJ NOI MATH-7648 蓄水池水管问题
。
-
总时间限制:
- 1000ms 内存限制:
- 65536kB
-
描述
-
蓄水池有甲、丙两条进水管和乙、丁两条排水管。
要灌满一池水,单开甲管需要a小时,单开丙管需要c小时;要排光一池水,单开乙管需要b小时,单开丁管需要d小时。
现在池内没有水,如果按甲乙丙丁的顺序循环单开各水管,每次每管开1小时,则多长时间后水开始溢出水池?
保证一定会在有限时间内出现水溢出水池的情况。
输入
- 一行,四个不大于10的正整数a,b,c,d,两个整数之间用单个空格隔开。a < b, c < d 输出
- 一个浮点数,即水溢出水池的时间。舍入到小数点后两位。 样例输入
-
3 4 5 6
样例输出
-
24.90
来源
- 《奥数典型题举一反三(小学六年级)》 (ISBN 978-7-5445-2883-2) 第二章 第二讲 习题15
问题分析
模拟题,直接模拟。
为了提高计算精度,使用分数进行模拟。
程序说明
(略)。
AC的C++语言程序:
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
long a, b, c, d;
long p, a2, b2, c2, d2, r;
float t;
cin >> a >> b >> c >> d;
p = a * b * c * d;
a2 = b * c * d;
b2 = a * c * d;
c2 = a * b * d;
d2 = a * b * c;
// 模拟处理
t = 0; // 时间
r = p; // 剩余体积
for(;;) {
if(a2 >= r) {
t += (float)r / a2;
break;
} else {
t += 1;
r -= a2;
}
t += 1;
r += b2;
if(c2 >= r) {
t += (float)r / c2;
break;
} else {
t += 1;
r -= c2;
}
t += 1;
r += d2;
}
// 输出结果
cout << fixed << setprecision(2) << t << endl;
return 0;
}