PIE 二分加贪心

题目描述
题意:作者要开一个生日party,他现在拥有n块高度都为1的圆柱形奶酪,已知每块奶酪的底面半径为r不等,作者邀请了f个朋友参加了他的party,
他要把这些奶酪平均分给所有的朋友和他自己(f+1人),每个人分得奶酪的体积必须相等(这个值是确定的),形状就没有要求。现在要你求出所有人都能够得到的最大块奶酪的体积是多少?
要求是分出来的每一份必须出自同一个pie,也就是说当pie大小为3,2,1,只能分出两个大小为2的,剩下两个要扔掉。
输入
T组测试数据 1<=T<=100
n,f   n块高度都为1的圆柱形奶酪,f个人 1 ≤ n,f ≤ 10 000
每块奶酪的底面半径为r, 1 ≤ ri ≤ 10 000
输出
现在要你求出所有人都能够得到的最大块奶酪的体积是多少?保留四位小数


样例输入
3
3 3
4 3 3
1 24
5
10 5
1 4 2 3 4 5 6 5 4 2
样例输出
25.1327
3.1416
50.2655
提示


PI = 3.1415926535897932;


**找出每人可分得的体积区间,在这个区间里面通过二分查找最优解

**注意double类型的二分查找的判断条件是 high-low>0.000001;


#include <iostream>
#include <cstdio>
const double PI=3.1415926535897932;
using namespace std;
double pie[10100];
int main()
{
	int N;
	cin>>N;
	while(N--)
	{
		int n,f;
		double low,high,sum,mid;
		cin>>n>>f;
		++f;
		int i,count;
		for(i=0,sum=0;i<n;++i)
		{
			cin>>pie[i];
			pie[i] *= pie[i]; 
			sum +=pie[i];
		}
		
		low = 0;//每人可分得的最小值 
		high = sum/f;//每人可分得的最大值 

		while(high-low>0.000001)//二分搜索最优解 
		{
			mid = (low+high)/2;
			count = 0;		
			for(i=0;i<n;i++)
				count += (int)(pie[i]/mid);
			if(count>f) //如果比实际人数多 就说明我们分小了, 
				low = mid;
			else if(count<f)//如果比实际人数少,说明分大了, 
				high = mid;
			else 
				low = mid;//如果于实际人数一样,根据本题,我么可以试着再放大一点试试! 
		}
		
		cout<<mid*PI<<endl;
		
	}
	return 0;
}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值