N 個圓柱派 (高=1,半徑 r_i),F 個朋友 + 自己共 F+1 人。每人分一塊(同一派可切多塊,但每塊必須完整來自某派)。所有人分到體積相等,求最大體積。誤差 ≤ 10⁻³。
floor(V_i / V) 塊
#include
#include
#include
using namespace std;
const double PI = acos(-1.0);
const double EPS = 1e-6;
double vol[10005];
int N, F;
bool check(double v) {
if (v < EPS) return true;
int cnt = 0;
for (int i = 0; i < N; ++i)
cnt += (int)(vol[i] / v);
return cnt >= F + 1;
}
int main() {
int T; scanf("%d", &T);
while (T--) {
scanf("%d%d", &N, &F);
double maxR = 0;
for (int i = 0; i < N; ++i) {
int r; scanf("%d", &r);
vol[i] = PI * r * r;
maxR = max(maxR, vol[i]);
}
double lo = 0, hi = maxR;
for (int iter = 0; iter < 50; ++iter) { // 固定迭代次數保證精度
double mid = (lo + hi) / 2;
if (check(mid)) lo = mid;
else hi = mid;
}
printf("%.4f\n", lo);
}
return 0;
}
將體積擴大 10000 倍轉為整數,但 double 精度足夠且代碼更簡潔。