H - Pie


N个Pie平均分给F+1个人 每个人分得的Pie只能是一块
采用二分  左界为最大的Pie/F+1 右界为最大的Pie 分得的Pie不可能在这个区间外边
如果分的份数少了  左界=mid  否则右界=mid  知道误差不超过0.001为止
不知道怎么判断误差可以直接循环100次  基本都没问题 

#include <iostream>
#include <string.h>
#include <algorithm>
#include <stdio.h>
#include <math.h>
#include <map>
#include <string>
#include <set>
#include <stack>
#include <queue>
using namespace std;
#define forseach(i,j,n) for(int i=j;i<n;i++)
#define debug freopen("in.txt","r",stdin),freopen("out.txt","w",stdout);
#define ios ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define PI acos(-1)
typedef long long ll;
const int maxn = 1e4+10;

int T,N,F;
double ori[maxn];
bool abc(double x)
{
	int ans=0;
	for(int i=0;i<N;i++)
	{
		ans+=int(ori[i]/x);
	}
	if(ans>=F)
		return 1;
	return 0;
}
int main()
{
	//debug;
	ios;
	cin>>T;
	while(T--)
	{
		cin>>N>>F;
		F++;
		for(int i=0;i<N;i++)
		{
			cin>>ori[i];
			ori[i]=PI*ori[i]*ori[i];
		}
		sort(ori,ori+N);
		double l=ori[N-1]/F,r=ori[N-1],mid;
		while(abs(r-l)>0.000001)
		{
			mid=(l+r)/2;
			if(abc(mid))
				l=mid;
			else
				r=mid;
		}
		printf("%.4f\n",mid);
	}
	return 0;
}


全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务