HDU 1969 Pie [二分]
1.题意:一项分圆饼的任务,一堆圆饼共有N个,半径不同,厚度一样,要分给F+1个人。要求每个人分的一样多,圆饼允许切但是不允许拼接,也就是每个人拿到的最多是一个完整饼,或者一个被切掉一部分的饼,要求你算出每人能分到的饼的体积最大值。输入数据依次给出,测试数据组数T,每组数据中,给出N,F,以及N个圆饼的半径。输出最大体积的数值,精确到小数点后四位。
2.分析:一看是这种输出就知道用二分写会很高效,这里对"能分出的最大体积值"进行二分。首先,这个值有界,最大值为总体积除以总人数的值,即ΣV/(F+1),最小值不妨设为0,然后在二分过程中判断mid值的大小,具体做法为:以mid"分割"N个圆饼,记录一个圆饼最多能分出多少个mid,最后统计一组圆饼能分出的mid数的总和cnt,接着对cnt讨论,cnt<F+1,mid大了,现有的饼分不出那么多,所以向上二分,cnt>=F+1,向下二分,大于小于都好理解,关键是cnt等于F+1时,此时以mid划分正好分出了F+1个,那么这就直接得到答案了么?分析一下,cnt==F+1,包含了mid偏小的情况,因为在此mid上增加一点有可能cnt不变。最后,由于输出格式为小数点后四位,所以当[l , r],这个区间的长度小于1e-5时就可以退出二分了。
Tips:Pi选用acos(-1.0),输出为%.4f,不然会WA 的
3.代码如下:
# include <iostream>
# include <cstdio>
# include <cmath>
using namespace std;
const double EPS=1e-;
const int MAXN=;
const double PI=acos(-1.0);
int T,N,F;
int R[MAXN];
int sgn(double x)
{
if(fabs(x)<EPS) return ;
if(x<) return -;
else return ;
}
bool judge(double mid)
{
int cnt=;
for(int i=;i<N;i++)
cnt+=(int)((R[i]*R[i]*PI)/(mid));
//printf("cnt=%d\n",cnt);
if(cnt<F+) return true;
else return false;
}
void Init()
{
scanf("%d%d",&N,&F);
for(int i=;i<N;i++)
scanf("%d",&R[i]);
}
void Solve()
{
double r=;
double l=;
for(int i=;i<N;i++)
r+=PI*R[i]*R[i];
r=r/(double)(F+);
while(sgn(fabs(r-l)-(1e-))>=)
{
//printf("%.5f %.5f ",l,r);
double mid=(l+r)/2.0;
//printf("%.5f\n",mid);
if(judge(mid)) r=mid;
else l=mid;
}
printf("%.4f\n",l);
}
int main()
{
scanf("%d",&T);
while(T--)
{
Init();
Solve();
}
return ;
}
HDU 1969 Pie [二分]的更多相关文章
- HDU 1969 Pie(二分查找)
Problem Description My birthday is coming up and traditionally I'm serving pie. Not just one pie, no ...
- HDU 1969 Pie(二分,注意精度)
Pie Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- (step4.1.2)hdu 1969(Pie——二分查找)
题目大意:n块馅饼分给m+1个人,每个人的馅饼必须是整块的,不能拼接,求最大的. 解题思路: 1)用总饼的体积除以总人数,得到每个人最大可以得到的V.但是每个人手中不能有两片或多片拼成的一块饼. 代码 ...
- hdu 1969 Pie(二分查找)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1969 Pie Time Limit: 5000/1000 MS (Java/Others) Me ...
- HDU 1969 Pie【二分】
[分析] “虽然不是求什么最大的最小值(或者反过来)什么的……但还是可以用二分的,因为之前就做过一道小数型二分题(下面等会讲) 考虑二分面积,下界L=0,上界R=∑ni=1nπ∗ri2.对于一个中值x ...
- 题解报告:hdu 1969 Pie(二分)
Problem Description My birthday is coming up and traditionally I'm serving pie. Not just one pie, no ...
- hdu 1969 pie 卡精度的二分
Pie Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- HDU 1969 Pie(二分法)
My birthday is coming up and traditionally I’m serving pie. Not just one pie, no, I have a number N ...
- HDU 1969 精度二分
Pie Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
随机推荐
- webpack详述
一.利用package.json执行打包任务 首先使用npm init生成package.json文件:然后配置scripts如下: "scripts": { "buil ...
- Project Euler Problem 7-10001st prime
素数线性筛 MAXN = 110100 prime = [0 for i in range(210000)] for i in range(2,MAXN): if prime[i] == 0: pri ...
- 洛谷P4018 Roy&October之取石子 题解 博弈论
题目链接:https://www.luogu.org/problem/P4018 首先碰到这道题目还是没有思路,于是寻思还是枚举找一找规律. 然后写了一下代码: #include <bits/s ...
- hdu 1358 Period (KMP求循环次数)
Problem - 1358 KMP求循环节次数.题意是,给出一个长度为n的字符串,要求求出循环节数大于1的所有前缀.可以直接用KMP的方法判断是否有完整的k个循环节,同时计算出当前前缀的循环节的个数 ...
- pip安装软件包报Could not fetch URL
报这个错误的原因是python.org已经不支持TLSv1.0和TLSv1.1了.更新pip可以解决这个问题,但是你不能用命令 pip install --upgrade pip 做更新,因为TLS证 ...
- Java RandomAccessFile用法(转载)
RandomAccessFile RandomAccessFile是用来访问那些保存数据记录的文件的,你就可以用seek( )方法来访问记录,并进行读写了.这些记录的大小不必相同:但是其大小和位置必须 ...
- Spring Data Jpa一对多单向映射
/** @author StormMaybin @date 2017-01-17 */ 生命不息,奋斗不止! 一对多映射关系 在JPA中,用@OneToMany来标识一对多的关系.实现一对多的单向关联 ...
- webpack学习(三)配置loader
首先搞清楚两个问题: 1 什么是loader? 2 为啥要用各种loader 答: loader 就是各种打包规则,为什么要用是显而易见的,因为webpack还没智能到给它什么文件都能打包,对于js文 ...
- Python--day31--TCP的长链接
- 安装scipy失败提示lapack not found
从python库网站下载numpy+mkl合集包通过pip安装在下载scipy安装包通过pip安装即可