1.题目编号
1003
2.简单题意
题目要求给出n个蛋糕的半径,还有总共m+1个人,要求每个人分的蛋糕必须是完整的一块,并且不能进行拼接,求最大的蛋糕
3.思路
由题意知不能进行拼接,所以可以在最大的和最小的中间范围进行二分算法,由此可以取出最大部分,还是二分算法
4.感想
二分的又一例题,虽然题目长了挺多,但还是二分算法的应用
5.代码
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const double pi=acos(-1.0);
double a[10005];
int n,m;
int check(double mid)
{
int i;
int sum=0;
for(i=0;i<n;i++)
{
sum+=int(a[i]/mid);
if(sum>=m)
return 1;
}
return 0;
}
int cmp(double a,double b)
{
return a>b;
}
int main()
{
int T,i,j;
double l,r,s;
cin>>T;
while(T--)
{
cin>>n>>m;
m++;
for(i=0;i<n;i++)
{
cin>>a[i];
a[i]=a[i]*a[i]*pi;
}
sort(a,a+n,cmp);
l=0;
r=a[0];
if(m<n)
n=m;
while(r-l>1e-5)
{
s=(r+l)/2;
if(check(s))
l=s;
else
r=s;
}
printf("%.4lf\n",l);
}
return 0;
}