HDU 1969 Pie【二分】

Pie

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


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
 

Source
 
 
思路:
 
          因为不同的馅饼不像是不同的面粉,能够称取一定的分量,而这个只能进行分割,以一个面积为标准,然后将不同面积的馅饼至少分成相同的面积的m+1份,将多余的馅饼丢掉,就是我们要求的面积,然后要其中的最大的那个面积,就是题目要求的面积!(这个题目刚开始看不懂,还是见得太少!)
          注意:①这道题的精度要求比较高所以pi要用acos(-1),(也就是cos(pi)==-1反余弦函数),其头文件是math.h;
                      ② 需要将块数进行取整(也就是a[i]/b要取整),因为你分过之后不够面积要求的要扔掉
                      ③这道题我将圆的面积直接用r*r来代替,然后最终才乘以pi,但是其实也可以在开始算的时候就直接乘上,也比较容易理解
 
代码:
 
/*
这道题因为圆饼和称的瓜子不一样,它必须是一个整体,所以只能在一个饼上进行分割,
所以不能用总的面积除以人数来求块数,而应该用二分查找,将最大的面积找出来,假设0是最小的
面积,在它两个之间进行二分查找,看看能不能找到一个面积,使它能够把圆饼分成大于等于人数的分数
取其中的面积的最大值! 
*/
#include <stdio.h>
#include <math.h>
double pi=acos(-1.0);//必须是-1.0,而不能是-1. 
double a[10005];
int  n,m;

int s(double b)//求给定面积能分成的块数 
{
	int i,t;
	t=0;
	for(i=0;i<n;i++)
	{
		t+=(int)(a[i]/b);//必须强制类型转化成整形,否则小数会往上加,最终有可能进位导致出错!!!! 
	}
	return t;
}

double erfen(double l,double r)//用二分法来求能分m+1块的最大的面积! 
{
	double mid=0;
	while(r-l>1e-7)
	{
		mid=(l+r)/2;
		if(s(mid)>=m+1) l=mid;
		else	r=mid;
	}
	return mid;
}

int main()
{
	int T,i,j,k,x;
	double s,t,max;
	scanf("%d",&T);
	while(T--)
	{
		max=0;
		scanf("%d%d",&n,&m);
		for(i=0;i<n;i++)
		{
			scanf("%d",&x);
			a[i]=1.0*x*x;
			max=a[i]>max?a[i]:max;//求面积的最大值(这个面积为对应圆面积的整数倍!) 
			
		}
		s=erfen(0,max);
		printf("%.4lf\n",pi*s);//这个就是要求的圆的面积! 
	}
	return 0;
}

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值