POJ NOI MATH-7648 蓄水池水管问题

问题链接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;
}



posted on 2017-04-02 10:22  海岛Blog  阅读(473)  评论(0编辑  收藏  举报

导航