LA 3635 Pie


题目大意:有F+1个人来分N个圆形派,每个人得到的必须是一整块派,而不是几块拼在一起,且面积要相同。求出每个人最多能得到多大面积的派(不必是圆形)

其实就是分吃的^ ^,要均分.

 

二分查找的应用。

找一个派最大的面积maxa,那么能得到的就是在0~maxa。

然后不断的取中间的面积mid进行判断是否满足要求就可以了。

怎么判断呢?

看它是否满足每个派分成面积为mid的小派是否能满足F+1个人。(这句有点绕口令的感觉T T吐槽:干嘛叫派啊。我还蛋黄派呢,好吧,看不懂的把它替换为蛋黄派^ ^)

每个蛋黄派最多能分成 π*r*r/mid个。

就是这样啦~

值得注意的是π的精度。

3.141592654被秒杀。但PI=3.1415926535898;就过了。

 

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const double PI=3.1415926535898;//书上是 PI=acos(-1.0);受教了
const int MAXN=10000+10;
double area[MAXN];
int main()
{
	int T,n,f,r;
	scanf("%d",&T);
	while(T--)
	{
		double maxa=0;
		scanf("%d%d",&n,&f);
		for(int i=0;i<n;i++)
		{
			scanf("%d",&r);
			area[i]=r*r*PI;
			maxa=max(maxa,area[i]);
		}
		double mid=maxa/2,upper=maxa,lower=0,ans=mid;
		while(upper-lower>1e-5)
		{
			int sum=0;
			for(int i=0;i<n;i++)
				sum+=floor(area[i]/mid);//也可以直接sum+=area[i]/mid; 但是看编译器警告好不爽T T
			if(sum>=f+1)
			{	lower=mid;	ans=mid;	}
			else 
				upper=mid;
			mid=(upper+lower)/2;

		}
		printf("%.4lf\n",ans);
	}
}


posted @ 2013-07-28 17:55  hr_whisper  阅读(217)  评论(0编辑  收藏  举报