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; }