POJ_1129 pie 解題報告

 
                                                                                                         J - Pie
      Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u
 

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.

My friends are very annoying and if one of them gets a bigger piece than the others, they start complaining. Therefore all of them should get equally sized (but not necessarily equally shaped) pieces, even if this leads to some pie getting spoiled (which is better than spoiling the party). Of course, I want a piece of pie for myself too, and that piece should also be of the same size.

What is the largest possible piece size all of us can get? All the pies are cylindrical in shape and they all have the same height 1, but the radii of the pies can be different.

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

 

這是一道關於生日的時候分餅的問題。要求是每個人分到的餅的體積要相同,並且只能由一塊大餅分成小餅,而不能是幾塊小餅拼湊成一塊大的。題目先輸入一個數表示一共有多少組數據,然後輸入兩個整數表示餅的個數和朋友的人數,再接着輸入每個餅的半徑。我們要求的是每個人可以分到的最大的餅的體積。要注意的是計算人數的時候一定要加上自己當看到這道題目的時候我的第一想法是通過將餅的大小進行排序,在根據人數的多少從大到小的順序進行分餅,這就要判斷每個餅分到人後的體積與下一個餅的體積的比較,還有體積的計算都不好算。後來我到網上找了思路才知道這道題目用二分法做比較簡單。先求出每個人能分到的最大的體積,即總體積除以總人數,然後對每個人將要分到的體積進行二分,將每個餅除以這個體積求出這些餅可以分成多少人,若此人數大於總人數就擴大二分法的左邊值繼續進行二分,反之就減小二分法的右值在進行二分,最後求出分到的最大體積。

#include<iostream>
#include <cmath>
using namespace std;
int A,B;
double V[10000];//用於記錄每個餅的體積。
double pi = acos ( -1.0 );//精確求pi的值。
int test(double mid)//二分的測試過程。
{
	int num=0;
	int i;
	for(i=0;i<A;i++)
	{
		num+=V[i]/mid;//求餅可以分成的總人數.
	}
	if(num>B)
		return 1;
	else
		return 0;
}
int main()
{
	int i,N,r;
	double v,R,L,mid;
	scanf("%d",&N);
	while(N--)
	{
		v=0;
		scanf("%d%d",&A,&B);
		for(i=0;i<A;i++)
		{
			scanf("%d",&r);
			V[i]=r*r*pi;
			v+=V[i];
		}
		L=0;
		R=v/(B+1);//計算每個人可分到的最大體積數。
		while((R-L)>1e-6)
		{
			mid=(R+L)/2;
			if(test(mid)==1)
				L=mid;
			else
				R=mid;
		}
		printf("%.4lf\n",mid);
	}
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章