题目链接:点击这里
解题思路
本题初一看感觉很简单,不就是多个派不同的人来分嘛。那就直接二分好了:
先得到最大的派的面积作为二分的右临界值,再让0当作左临界值,然后设置人数约束,看是否所有条件都满足即可
注意
- 由于此题需要精度输出,需要牢记C++里面的精度输出需要使用头文件
#include<iomanip>
,并在cout<<fix<<setprecision(x)
进行设置。 - 由于使用了double,因此在判断条件结束时不能简单的写成
left = right
,必须控制精度。 - 需要使用PI的值,在
math.h
头文件中有定义M_PI
宏。
示例代码
#include <iostream>
#include <math.h>
#include<iomanip>//指定输出精度
using namespace std;
const int maxn = 10000 + 5;
double pie[maxn];
int n,f;
bool IsOK(double area)
{
int sum = 0;
for (int i =0; i < n ; i++)
{
sum += floor(pie[i]/area);
}
return (sum>=f+1);
}
int main()
{
int kcase ;
cin >>kcase;
while (kcase--)
{
cin>>n>>f;
double maxarea = -1;
for (int i=0; i< n; i++ )
{
int r;
cin>>r;;
pie[i] = M_PI*r*r;
maxarea = max(maxarea,pie[i]);
}
double left = 0,right = maxarea;
while (right- left > 1e-6)
{
double middle = (left + right)/2;
if (IsOK(middle))
left = middle;
else
right = middle;
}
cout << fixed<<setprecision(4) << right << endl;
}
return 0;
}
最后,欢迎关注我的个人博客。