题目

http://noi.openjudge.cn/ch0111/05/

描述

我的生日要到了!根据习俗,我需要将一些派分给大家。我有N个不同口味、不同大小的派。有F个朋友会来参加我的派对,每个人会拿到一块派(必须一个派的一块,不能由几个派的小块拼成;可以是一整个派)。

我的朋友们都特别小气,如果有人拿到更大的一块,就会开始抱怨。因此所有人拿到的派是同样大小的(但不需要是同样形状的),虽然这样有些派会被浪费,但总比搞砸整个派对好。当然,我也要给自己留一块,而这一块也要和其他人的同样大小。

请问我们每个人拿到的派最大是多少?每个派都是一个高为1,半径不等的圆柱体。

输入

第一行包含两个正整数N和F,1 ≤ N, F ≤ 10 000,表示派的数量和朋友的数量。
第二行包含N个1到10000之间的整数,表示每个派的半径。

输出

输出每个人能得到的最大的派的体积,精确到小数点后三位。

样例输入

3 3
4 3 3

样例输出

25.133

思路

解题方法: 通过二分查找,找到合适的派的体积

这道题主要需要注意的问题是

  • 精度问题:pi的精度要求很高;不可以使用float,应该使用double
  • 注意每个人只能有一块派,不存在同时拿了一个整块+一个小块的情况
  • 朋友数f应该加1,因为“我”也要 派

我的代码

我的代码主要问题就是分配过程很繁琐:每一块派,各种分情况讨论

#include<iostream>
#include<iomanip>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
#define  pi 3.141592653589793238662;int assign(double vm, int f, double v[], int n)
{int i = 0, j = 0;double res = 0;double need = vm;for (i = 0; i < f; i++)//对于i个朋友,j个蛋糕{need = vm;while (need != 0 || j < n){if (res >= need)//如果上一个剩下的蛋糕足够给第j个人{res -= need;need = 0;break;}if (v[j] >= need) //将当前蛋糕分给第j个人{res = v[j] - need;need = 0;j++;}else//如果当前蛋糕小于分给第j个人的量,则跳过这个蛋糕,看下一个蛋糕{j++;}}if (j > n) break;}if (i < f || need!=0)  return 1;//蛋糕每份过大,不足每人分配if (j < n) return 0;//蛋糕每份过小,还有剩余return 0;//如果以上两个不满足,则是有剩余
}double v[10000];
int main()
{int assign(double vm, int f, double v[], int n);int n, f;cin >> n >> f;++f;//包括自己int r;int i = 0;double MAX = 0, MIN = 0;for (i = 0; i < n; i++){cin >> r;v[i] = r * r*pi;MAX += v[i];}MAX /= f; // 平均分,是体积最大的情况double vm = MIN + (MAX - MIN) / 2;double vm_p = 0;double precision = 100;while (precision > 0.0001)//上一次和本次差距小于0.0001{vm_p = vm;int flag = assign(vm, f, v, n);if (flag)MAX = vm;elseMIN = vm;vm = MIN + (MAX - MIN) / 2;precision = abs(vm - vm_p);}cout << fixed << setprecision(3) << vm;return 0;
}

参考代码

参考代码中值得学习的地方:

  • 二分查找中常用的精度控制: while(R-L>1e-5) ;而不必像我的代码(设置新的变量,存储上一次的体积值,和本次对比,改变小于 1e-5)
  • 类似的二分查找中常用的停止方式是:while(R<=L)
  • 分配过程的处理,直接将每个 派 除以最大体积数,并将结果向下取整(使用函数floor() )。将 “按最大体积能分配给多少人” 与 “实际到场的朋友” 对比,调整查找范围
    这样的分配过程处理方法,简洁了很多
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;const int maxn = 10000+10;
const double PI=acos(-1.0);  //取PHI
double a[maxn];
int n,m;bool can(double S) {int cnt=0;for(int i=1;i<=n;i++) cnt += floor(a[i]/S);return cnt>=m+1;        //m+1 自己
}int main() {scanf("%d%d",&n,&m);double L=0,R=0;for(int i=1;i<=n;i++) {scanf("%lf",&a[i]);a[i]=PI*a[i]*a[i];R=max(a[i],R);}double mid;while(R-L>1e-5) {mid=(L+R)/2;if(can(mid)) L=mid;else R=mid;}printf("%.3lf\n",L);return 0;
}

1.11 05:派相关推荐

  1. Interview:算法岗位面试—11.05下午上海某银行信息(总行,四大行之一)技术岗笔试记录

    Interview:算法岗位面试-11.05下午上海某银行信息(总行,四大行之一)技术岗笔试记录 导读:这次记住了上次银行考试的教训,提前选择了离着学校较近的考点.这次笔试比上次银行考试相对简单,但是 ...

  2. 11.05 scrum report

    转载于:https://www.cnblogs.com/76er/archive/2012/11/05/2756161.html

  3. Daily Scrum Meeting 11.05

    今天主要是继续周末的积压工作: Id Name Today's Task Next Task 1 Yin PC 首页动态化(task180) 首页动态化(task180) 2 Chen YN QA p ...

  4. 2021年全国大学生电子设计大赛每一个注意问题11.05

    2021年全国大学生电子设计大赛注意问题11.05 A,信号失真度测量装置 B,三相AC-DC变换电路 C 三端口DC-DC变换器 D,基于互联网的摄像测量系统 E 数字-模拟信号混合传输收发机 F ...

  5. Ubuntu18开机速度突然变慢问题的解决(2019.11.05)

    Ubuntu18开机速度突然变慢问题的解决(2019.11.05) 1 前言(伏笔) 2 分析一:可能是由于一些开机启动程序导致的 3 分析二:从启动日志查找原因 参考 1 前言(伏笔) 笔者的笔记本 ...

  6. linux 开机速度 固态,Ubuntu18开机速度突然变慢问题的解决(2019.11.05)

    Ubuntu18开机速度突然变慢问题的解决(2019.11.05) 1 前言(伏笔) 2 分析一:可能是由于一些开机启动程序导致的 3 分析二:从启动日志查找原因 参考 1 前言(伏笔) 笔者的笔记本 ...

  7. Java第十二天~第十三天/11.04~11.05

    第十二天/11.04 一.选择排序 从0索引开始,用它对应的元素依次和后面索引对应的元素进行比较,小的往前放,第一次比较完毕后,最小值出现在最小索引处,依次比较,就可以得到一个排好序的数组. pack ...

  8. 2022.11.05 第六次周报

    文章目录 前言 一.文献阅读 背景: 1.1 第二节 CONVOLUTIONAL NEURAL NETWORKS FOR ISOLA TED CHARACTER RECOGNITION 单对象识别 1 ...

  9. MySQL_2020.11.05

    MySQL MySQL day01 1.sql.DB.DBMS分别是什么,他们之间的关系? 2.什么是表? 3.学习MySQL主要还是学习通用的SQL语句,那么SQL语句包括增删改查,SQL语句怎么分 ...

最新文章

  1. Jquery 之Ajax方法$.get() 的运用,扩展链接模型的天地
  2. Spring Cloud中Hystrix 线程隔离导致ThreadLocal数据丢失(续)
  3. 亲爱的,你是最棒的!
  4. links下c语言中for的作用是,C语言开发注意事项
  5. php extract 变量覆盖,extract变量覆盖
  6. oracle 有计划任务吗,oracle计划任务的问题
  7. 基于linux 的2048
  8. 了解git的命令行使用
  9. 仿path首页滑动效果
  10. SQL Server提取字段中的所有数字
  11. CamShift算法,OpenCV实现1--Back Projection
  12. Atitit 互联网2018风口与趋势大盘点 目录 1.1. 短视频 1 1.2. 互联网金融 1 1.3. 区块链 1 1.4. 新零售 1 2. 2018热度榜丨你能抓住的风口有几个?.html
  13. 58、IPv6访问控制列表及ICMPv6简介
  14. Mac安装wget流程及异常解决
  15. uni-app nvue/vue 引入第三方字体教程,在线ttf转base64和在线识别字体网站分享
  16. mysql mtq_第十六节:Mysql中的关键字
  17. 写一篇大数据背景下室内设计的论文
  18. 流媒体之老黄谈流媒体服务与视频网站研发
  19. 一篇评价牛顿的搞笑文章,作者老罗,但很有才
  20. leetcode:1276. 不浪费原料的汉堡制作方案(贪心)

热门文章

  1. 《FM/AM相邻信道选择性测试》
  2. mysql数据库备份工具_MySQL数据库备份工具和六种方法介绍
  3. 【C语言】字符串小练习(每日小细节012)
  4. java math.sin()_Java Math.sin() 方法
  5. 1分钟教会你如何提取自己喜欢的视频文案,别再手抄文案了
  6. html代码怎么做成链接,HTML的链接代码怎么做?HTML的图片链接怎么制作?
  7. 数字城市与智慧城市的创建,数字化大数据技术的应用
  8. 企业流程管理差距在哪里
  9. 修改华为定位服务器,华为手机提高GPS搜星定位速度的方法
  10. iOS+Android+APP+IAP