您的位置:首页 > 其它

HDU1969 PIE 二分查找

2014-07-26 22:00 274 查看
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1969
题目意思:有n个块饼和M+1个人要分饼,且每人一块,饼不能拼接,要求每人分得的最大的饼的面积

思路:二分,先用总的饼的面积 / 人数 = 理论上最大面积,取为上界high,再求一个mid ,一直到循环退出,不能在中途找到时结束循环

if(饼能分成M+1份)

{ left = mid }

else { right = mid }

#include<cstring>
#include<string>
#include<fstream>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cctype>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<stack>
#include<ctime>
#include<cstdlib>
#include<functional>
#include<cmath>
using namespace std;
#define PI acos(-1.0)
#define MAXN 100005
#define eps 1e-7
#define INF 0x7FFFFFFF
#define ff sqrt(5.0)
double val[100005];
int n,m,t;
int check(double x)
{
int sum=0;
for(int i = 0;i < n;i++)
{
sum += val[i] / x;
}
if(sum >= m + 1) return 1;
else return 0;

}
double mid,r,l,maxval;

int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
maxval = 0;
for(int i = 0;i < n; i++)
{

scanf("%lf",&val[i]);
val[i] = val[i] * val[i] * PI;
maxval += val[i];
}
mid = maxval / (m + 1);
r = mid;
l = 0.0;
while(r - l > 1e-7)
{
if(check(mid))
{
l = mid;
}
else
{
r = mid;
}
mid=(l + r) / 2.0;
}
printf("%.4lf\n",mid);
}
return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: