1 条题解
-
0
#include<bits/stdc++.h> using namespace std; // 题目给定的高精度π值 const double PI = 3.141592653589793; // 浮点数极小值,避免除零/精度判断问题 const double eps = 1e-8; int main() { // 加速输入输出,处理大数据用 ios::sync_with_stdio(false); cin.tie(0); // [1] 输入测试用例数量 int T; cin >> T; while (T--) { // [2] 输入饼的数量N、朋友数量F,总份数=朋友+自己 int N, F; cin >> N >> F; int required = F + 1; // [3] 计算每个饼的体积(高=1,体积=π*r²),记录最大单饼体积 vector<double> pies; double max_volume = 0.0; for (int i = 0; i < N; i++) { int r; cin >> r; double vol = PI * r * r; pies.push_back(vol); max_volume = max(max_volume, vol); } // [4] 初始化二分边界:最小体积0,最大体积为最大单饼体积 double left = 0.0, right = max_volume, max_v = 0.0; // [5] 浮点数二分核心:固定迭代100次,保证精度远超过1e-4要求 for (int iter = 0; iter < 100; iter++) { // 计算当前验证的每份体积mid double mid = (left + right) / 2; // 避免除零,直接跳过极小值 if (mid < eps) break; // 记录当前mid下能切出的总块数(long long防止溢出) long long total = 0; for (double vol : pies) { total += (long long)(vol / mid); // 显式向下取整,符合题意 if (total >= required) break; // 剪枝:满足需求提前终止 } // [6] 判断当前mid是否可行:总块数≥需要的份数 if (total >= required) { max_v = mid; // 记录可行的最大体积 left = mid; // 尝试更大的体积,调整左边界 } else { right = mid; // 体积过大不可行,调整右边界 } } // [7] 输出结果:保留4位小数,用%.4lf匹配double类型 printf("%.4lf\n", max_v); // 也可用C++ cout输出,效果一致 // cout << fixed << setprecision(4) << max_v << endl; } return 0; }
- 1
信息
- ID
- 1226
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 2
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者