简单二分 主要是圆台体积公式
水平面的半径u可以根据直角梯形的面积求出:
(r+u)*h + (u+R)*(H-h) = (r+R)*H
得出(R-r)*h = (u-r)*H
得 u = r + (R-r)*h/H
圆台体积计算公式:V= π*h*( R^2 + R*u + u^2 ) / 3
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstring>
#include <cstdio>
#include <vector>
#include <string>
#include <iterator>
#include <cmath>
#include <deque>
#include <stack>
#include <cctype>
#include <iomanip>
using namespace std;
typedef long long ll;
typedef long double ld;
const int N = 11000;
const int INF = 0xfffffff;
const double EPS = 1e-8;
const ll MOD = 1e9 + 7;
const ld PI = 3.1415926535897932384626433832795;
#define INFL 0x7fffffffffffffffLL
#define met(a, b) memset(a, b, sizeof(a))
#define rep(c, a, b) for (int c = a; c < b; c++)
#define nre(c, a, b) for (int c = a; c > b; c--)
#define put(a) cout << setiosflags(ios::fixed) << setprecision(a)
double r, R, h, v;
double sol (double x);
int main ()
{
int t; cin >> t;
while (t--)
{
cin >> r >> R >> h >> v;
double l = 0, r = h, mid;
while (r - l > EPS)
{
mid = (l + r) / 2;
if (sol (mid) - v > EPS) r = mid;
else l = mid;
}
put (6) << mid << endl;
}
return 0;
}
double sol (double x)
{
double u = r + (R - r) * x / h;
return PI * x * (u * u + r * r + r * u) / 3;
}