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; }