ZOJ 3913 球缺

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
const double pi = acos(-1.0);
const double eps = 1e-10;
struct circle
{
    double h, r;
    void input()
    {
        scanf("%lf%lf", &h, &r);
        h -= r;
    }
    double calc(double tmp)
    {
        double d = max(0.0, tmp - h);
        d = min(2 * r, d);
        return pi * (r * d * d - d * d * d / 3);
    }
} c[maxn];
struct cube
{
    double h, a, b, c;
    void input()
    {
        scanf("%lf%lf%lf%lf", &h, &a, &b, &c);
        h -= c / 2;
    }
    double calc(double tmp)
    {
        double d = max(0.0, tmp - h);
        d = min(d, c);
        return a * b * d;
    }
} s[maxn];
double w, l, v;
int n, m, T;
int dcmp(double a)
{
    if (fabs(a) <= eps) return 0;
    if (a < 0) return -1;
    return 1;
}
double check(double height)
{
    double tot = w * l * height;
    for (int i = 0; i < n; i++)
        tot -= s[i].calc(height);
    for (int i = 0; i < m; i++)
        tot -= c[i].calc(height);
    return tot + eps >= v;
}
int main(int argc, char const *argv[])
{
    scanf("%d", &T);
    while (T--)
    {
        scanf("%lf%lf%lf%d%d", &w, &l, &v, &n, &m);
        for (int i = 0; i < n; i++)
            s[i].input();
        for (int i = 0; i < m; i++)
            c[i].input();
        double l = 0, r = 10000000000.0;
        while (l + eps < r)
        {
            double mid = (l + r) / 2.0;
            if (check(mid)) r = mid;
            else l = mid;
        }
        printf("%.6lf\n", r);
    }
    return 0;
}


有一个无穷高的长方体,里面有一些球和小的长方体,然后往大的长方体里面倒水,水只能填充到间隙里面,问水能填多高。  告诉的有 ,水的体积,大的长方体的长和宽,以及每个小的长方体的中心的高度,及它的长宽高,和球的中心的高度以及球的半径。

球缺的体积为:V=πH^2(R-H/3)

二分答案即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值