用c++完成这道题:题目描述 我的生日快到了,我们这有过生日做馅饼的传统。我朋友们要来参加我的生日宴会,他们每人将会得到一块馅饼。 这应该是一个馅饼的一块,而不是几个小块。不过,这一块也可以是一整块馅饼。我的朋友们都很讨厌,如果他们中的一个分到的比其他人更多,他们就会开始抱怨。 因此,所有的馅饼都应该得到同样大小(但不一定是同样形状)的馅饼,即使这会导致一些馅饼变质(这比破坏聚会要好)。 当然,我自己也要有一块馅饼,而且那块馅饼也应该一样大。 我们能得到的最大可能的尺寸是多少?所有的馅饼都是圆柱形的,它们都有相同的高度1,但是馅饼的半径可以不同。 输入 第一行正整数m,表示测试的数量。对于每个测试用例: 第一行有两个整数N和F,1<=N,F<=10000 分别表示 馅饼的数目和朋友的数目。 第二行有N个整数ri,1<=ri<=10000 表示 馅饼 的半径。 输出 对于每个测试用例,输出一行最大可能的体积V,这样我和我的朋友都可以得到一块体积为V大小的馅饼。 答案V应以浮点数形式给出,绝对误差不超过10^(-3)。 样例 输入复制 3 3 3 4 3 3 1 24 5 10 5 1 4 2 3 4 5 6 5 4 2 输出复制 25.1327 3.1416 50.2655
时间: 2024-03-10 10:48:18 浏览: 67
以下是用C++实现的代码,可以通过该题:
```c++
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const double PI = acos(-1);
int main() {
int T;
cin >> T;
while(T--) {
int n, f;
cin >> n >> f;
double r[n];
double maxr = 0;
for(int i = 0; i < n; i++) {
cin >> r[i];
maxr = max(maxr, r[i]);
}
double l = 0, r = PI * maxr * maxr;
while(r - l > 1e-6) {
double mid = (l + r) / 2;
int cnt = 0;
for(int i = 0; i < n; i++) {
cnt += floor((PI * r[i] * r[i]) / mid);
}
if(cnt >= f + 1) {
l = mid;
} else {
r = mid;
}
}
printf("%.4lf\n", l);
}
return 0;
}
```
其中,我们使用二分法来找出最大可能的体积V,使得我和我的朋友都可以得到一块体积为V大小的馅饼。具体地,我们二分V的值,然后计算出可以得到的馅饼的块数cnt,如果cnt >= f + 1,说明可以得到的馅饼块数大于等于f + 1,即我和我的朋友都可以得到一块体积为V大小的馅饼,此时我们缩小右端点,继续二分;否则,我们增大左端点,继续二分。最后输出左端点l的值即可。
阅读全文