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

本文探讨了蓄水池的甲、丙两进水管及乙、丁两排水管的循环工作问题,通过模拟方法计算出水开始溢出的时间。采用分数模拟以提高计算精度,并给出了C++实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值