二分思想不仅仅用于二分查找哦,本题感觉难在理解题意。需要注意的是,饼的所以饼的体积取值应该是0到max间任意值,因为蛋糕不能拼凑可以多余,深入的想想就知道分到蛋糕最大的情况应该是找到一个极值,然后部分蛋糕根本不需要用上,部分蛋糕会有多余。想到这个后这个体积极值就顺利成章要用二分求了,因为没有具体的元素个数,耿直的顺序查找来求极值的方法用不了的。 我一开始是想枚举所有将蛋糕完整分给每个人的情况,相信大多数同志也是跳的这个坑,这样做其实是不会比正确解法分得的蛋糕多的,相信你对比下就知道了。
#include <iostream>
#include <stdio.h>
#include<math.h>
#define pi acos(-1.0)//准确定义Π的值
using namespace std;
/*思路是对0到max二分查找,根据大小算人数,人数与f+1比较后改变查找边界
因为蛋糕不能拼凑可以多余,所以饼的体积取值应该是0到max间任意值,一开始我没有注意到这点。。
所以不能枚举要二分查找逼近那个值
*/
int main()
{int n,t,f,i,r,pep;
double s[10005];
double max,min,mid;
scanf("%d",&t);//测试用例数
while(t--)
{
min=0;max=0;
scanf("%d%d",&n,&f);
f++;
for(i=1;i<=n;i++)
{
scanf("%d",&r);
s[i]=pi*r*r;
if(max<s[i]) max=s[i];
}
while(max-min>1e-7)
{ pep=0;
mid=(max+min)/2;
for(i=1;i<=n;i++)
pep+=(int)(s[i]/mid);//s【i】/mind一定要有括号,才是对整体强制转换
if(pep>=f)
min=mid;
else max=mid;
}
printf("%.4lf\n",mid);
}
}