HUD 1969:Pie(二分)

                                                 Pie

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 16056    Accepted Submission(s): 5654

Problem 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

题意

有n个馅饼,和f个朋友。要求主人和朋友所分到的馅饼的体积一样大(忽略形状,但是每个人分到的馅饼必须是一块)。问最后每人能分到的最大的馅饼的体积

思路

求出来n个馅饼的总体积,然后算出(f+1)个人能分到的最大的馅饼体积(无视每人分到的馅饼数)area。然后以0为下限,area为上限,进行二分,上下限的误差达到一定的值(至少要达到1e-5)。

这题卡精度卡的好难受,听说还会卡pi的值QAQ

AC代码

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <limits.h>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <set>
#include <string>
#define ll long long
#define ms(a) memset(a,0,sizeof(a))
#define pi acos(-1.0)//听说这个也会被卡
#define INF 0x3f3f3f3f
#define size 1e-5
const double E=exp(1);
const int maxn=1e6+10;
using namespace std;
double a[maxn];
int n,f;
//用这个函数来判断该馅饼体积是否符合要求
bool slove(double x)
{
	int num=0;
	for(int i=0;i<n;i++)
	{
		//这里(a[i]/x)要强制转换,否则会WA
		num+=int(a[i]/x);
	}
	if(num>=f+1)
		return true;
	else
		return false;
}
int main(int argc, char const *argv[])
{
	int t;
	double R;
	cin>>t;
	while(t--)
	{
		double area=0.0;
		ms(a);
		cin>>n>>f;
		for(int i=0;i<n;i++)
		{
			cin>>R;
			a[i]=pi*R*R;
			area+=a[i];
		}
		double r=area/(f+1);
		double l=0.0;
		double mid;
		//注意精度的控制,size至少要达到1e-5
		while(r-l>size)
		{
			mid=(r+l)/2;
			//如果符合条件,移动下限,否则移动上限
			if(slove(mid))
				l=mid;
			else
				r=mid;
		}
		printf("%.4lf\n",mid);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/wang_123_zy/article/details/81262093
HUD