搜索—Problem_1003-Pie
题意
分馅饼问题,有n块馅饼(半径大小不同),f个朋友,现在平分馅饼,要求每个人分得的馅饼体积相同(自己也要分到),在这过程中馅饼只能切不能拼接,求每个人可分到馅饼的最大体积。
解题思路
使用二分搜索,分析下,每个人分得最多馅饼的体积是现有的馅饼中最大那块的体积,最少就是0,,以此展开搜索,找到mid,并判断以此体积时能分得的人数并与总人数相比,如果多于总人数,使low变为mid,反之high为mid,按照这种方式搜索下去即可。
感想
这一题目虽然是二分搜索时的例题,但还是出现了很多问题,如圆周率的精确使用,超时等等,做的焦躁,WA和Time Limit Exceeded太多次,呵呵。
AC代码
#include<iostream>
#include<cmath>
#define PI acos(-1.0)
using namespace std;
int main()
{
int t;
int n,f;
double size[10010];
double sum;
cin>>t;
while(t--)
{
cin>>n>>f;
double rid;
sum=0;
double max=0;
for(int i=0;i<n;i++)
{
cin>>rid;
size[i]=rid*rid*PI;
sum+=size[i];
if(i==0) max=size[i];
if(max<size[i]) max=size[i];
}
double low,high,mid;
low=0;
high=max;
mid = (high + low) / 2;
while ( (high-low) >= 1e-6 )
{
int count=0;
for(int i=0;i<n;i++)
{
count+=(int) (size[i] / mid);
}
if(count>=f+1) low=mid;
else high=mid;
mid = (high + low) / 2;
}
printf("%0.4lf\n",mid);
}
}