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 ;
}

最新文章

  1. 小猪cms命名规则整理
  2. time和datetime时间戳---python
  3. MyEclipse卡死解决
  4. [Effective C++ --019]设计class犹如设计type
  5. Hadoop MapReduceV2(Yarn) 框架简介
  6. 修改原代码定制bootstrap
  7. TWinControl的刷新过程(5个非虚函数,4个覆盖函数,1个消息函数,默认没有双缓冲,注意区分是TCustomControl还是Windows原生封装控件,执行流程不一样)
  8. 4th day
  9. angularJS内置指令一览
  10. NetAnalyzer笔记 之 五 一些抓包技巧分享(不定期更新)
  11. UESTC_Sea Base Exploration CDOJ 409
  12. Coreseek:indexer crashed神秘
  13. Python md5解密
  14. Android Button四种点击事件和长按事件
  15. ModuleNotFoundError: No module named &#39;video_back.urls&#39;
  16. python 优先队列
  17. Session会话与Cookie简单说明
  18. 配置sonar和jenkins进行代码审查
  19. 笔记三:python乱码深度剖析一
  20. vue实现首页导航切换不同路由的方式

热门文章

  1. bzoj1614 架设电话线
  2. HZOJ 太阳神
  3. 使用 Captcha 扩展包 为 Laravel 5 应用生成验证码
  4. 5.0.1版本的react-router-dom路由传参以及路由表的配置和接收页面的接受
  5. thinkphp3.2配置redis缓存和文件缓存
  6. html实体字符转换成字符串
  7. Linux 运算符
  8. hdu 3272 Mission Impossible
  9. BERT可视化工具bertviz体验
  10. laravel 5.6 请教邮件中的cc,bcc是什么意思,有什么用?