Pie Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9653 Accepted: 3478 Special Judge
Description
My birthday is coming up and traditionally I"m serving pie. Not just one pie, no, I have a number N of them, of various tastes and of various sizes. F of my friends are
coming to my party and each of them gets a piece of pie. This should be one piece of one pie, not several small pieces since that looks messy. This piece can be one whole pie though. Input
One line with a positive integer: the number of test cases. Then for each test case: One line with two integers N and F with 1 ≤ N, F ≤ 10 000: the number of pies and the number of friends.One line with N integers ri with 1 ≤ ri ≤ 10 000: the radii of the pies.Output
For each test case, output one line with the largest possible volume V such that me and my friends can all get a pie piece of size V. The answer should be given as a floating point number with an absolute error of at most 10?3.Sample Input
3 3 3 4 3 3 1 24 5 10 5 1 4 2 3 4 5 6 5 4 2
Sample Output
25.1327 3.1416 50.2655
Source
Northwestern Europe 2006題意是將,一哥們過生日,來了f個人,有n個披薩餅,這些披薩餅有著相同的厚度和各自的半徑。然後這些哥們想吃披薩,每個人又想吃的都是一樣的數量,而且不能大家都不想去吃用剩下的邊角料留下的披薩,所以就問每個人吃披薩餅的最大量。
思路大概就是二分答案了。但是有個小問題就是精度。首先是PI,要不用C++的反三角函數去計算,要不就去網上找常量去計算。接著是誤差限,一定要注意1e-5。最後一個就是提交問題了。我會回頭再說明選擇G++和C++的區別。
/**** *@author Shen *@title poj 3122 */ #include#include #include using namespace std; const double PI = acos(-1.0); const double eps = 1e-5; int n, f; double r, v[10005]; double maxa = 0; bool test(double x) { int sum = 0; for (int i = 0; i < n; i++) sum += int(v[i] / x); return sum >= (f + 1); } double Bsearch(double l, double r) { while (r - l > eps) { double mid = (r + l) * 0.5; if (test(mid)) l = mid; else r = mid; } return l; } void solve() { scanf("%d%d", &n, &f); maxa = 0; for (int i = 0; i < n; i++) { scanf("%lf", &r); v[i] = r * r * PI; maxa = max(maxa, v[i]); } double ans = Bsearch(0.0, maxa); printf("%.4lf\n", ans); } int main() { int t; scanf("%d", &t); while (t--) solve(); return 0; }