HDU 1969 Pie【二分】

来源:互联网 发布:c语言input是什么意思 编辑:程序博客网 时间:2024/05/16 09:11

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
33 34 3 31 24510 51 4 2 3 4 5 6 5 4 2
 

Sample Output
25.13273.141650.2655
 

Source
NWERC2006
 
 
思路:
 
          因为不同的馅饼不像是不同的面粉,能够称取一定的分量,而这个只能进行分割,以一个面积为标准,然后将不同面积的馅饼至少分成相同的面积的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;elser=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;}

 
0 0