题目描述

我们有n根的木棍。现在从这些木棍中切割出来m条长度相同的木棍,问这m根木棍最长有多长?

输入数据

  • 第一行输入两个数字,n和m n(1<=n<=1000)为木棍数目 m(1<=m<=1000)为需要切割出的相同长度的木棍数目
  • 随后n个正整数,表示原始木棍的长度(<=10000)

输出数据

每组输出一行结果,表示切割后绳子的最长长度(保留两位小数)

样例输入

4 5
5 6 7 8

样例输出

4.00

初始思路

  • 因为要求切割的最大长度,本来想着从木棍长度中找到最大的长度,不断递减向下寻找,直到能切割的数目>= m。!不过不可以,因为切割的长度极有可能不为整数。

正解思路

  • 明确切割木棍的长度最粗略的范围就是0到当前木棍中最长的那个
  • 明确范围之后,我们就可以使用二分查找了(因为数据是有序的)
  • 每一次查找要计算 以当前mid指向的长度 切割的 木棍数目num
  • num 大于等于m(想要的数目) 说明木棍长度小了 所以要更新leftmid
  • 反之 更新 rightmid
  • 直到left 等于right时,就找到了满足当前条件的最长的切割长度了

代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cmath> //round四舍五入
using namespace std;
int main()
{int n, m;vector<int> lens;cin >> n >> m;for (int i = 0; i < n; i++){int temp;cin >> temp;lens.push_back(temp);}auto max = max_element(lens.begin(), lens.end()); //max_element 返回的是迭代器double l = 0, r = *max;                           //能切割的木棒长度 最粗略的范围就是0到当前木棒中最大的double mid;while (l + 0.01 < r) //不断更新范围 直到 l = r = 最佳解{int num = 0;mid = round(((l + r) / 2.00) * 100) / 100.00; //保证精度// float middd = round(l + r) / 2.00;            //不可以 (4+4.5)=4.5for (int i = 0; i < n; i++)num += (int)(lens[i] / mid); //针对当前长度 看每个lens能切割成多少个if (num >= m)                    //当前的切割 得到的木棍多 说明当前的切割长度小了l = mid;elser = mid;}printf("%.2f", l);system("pause");return 0;
}

补充

  • mid = round(((l + r) / 2.00) * 100) / 100.00; 为了保证精度到小数点后两位
  • num += (int)(lens[i] / mid); 因为木棍切割只能向下取整,所以int的除法刚好合适
  • max_element() 返回容器中最大值的迭代器,所以输出值的话要对其取 *
  • 对于格式化的输入和输出,scanfprintf更方便
  • 若文章存在问题,还请各位大佬批评指正,共同进步。

枚举算法实践2-切割木棍 c++相关推荐

  1. 枚举算法实践3-Lucky number c++

    题目描述 李老师的lucky number 是3,5和7,他爱屋及乌,还把所有质因数只有3,5,7的数字认定为lucky number,比如9, 15, 21, 25等等.请聪明的你帮忙算一算小于等于 ...

  2. 求解二维矩形 Packing 问题的一种优美度枚举 算法的个人心得1

    求解二维矩形 Packing 问题的一种优美度枚举 算法的个人心得 个人思考: 10.14: 提出了基于 "角区"的基本算法 什么是角区? 定义4 (角区) 矩形框中由块或者矩形框 ...

  3. 深度学习算法实践(基于Theano和TensorFlow)

    深度学习算法实践(基于Theano和TensorFlow) 闫涛 周琦 著 ISBN:9787121337932 包装:平装 开本:16开 用纸:胶版纸 正文语种:中文 出版社:电子工业出版社 出版时 ...

  4. 好程序员web前端分享javascript枚举算法

    好程序员web前端分享javascript枚举算法,题目:在1,2,3,4,5 五个数中,我们随机选取 3个数.问有多少种取法?并且把每种取出数的方法列举出来. 乍看这道题,其实感觉没什么难度.三个f ...

  5. 人脸验证 DeepID 算法实践

    人脸验证 DeepID 算法实践 4,610 次阅读 - 文章 作者:雨石  出处:雨石的博客 目前人脸验证算法可以说是DeepID最强,本文使用theano对DeepID进行实现.关于deepid的 ...

  6. SDCC 2015算法专场札记:知名互联网公司的算法实践

    SDCC 2015算法专场札记:知名互联网公司的算法实践 发表于4小时前|526次阅读| 来源作者投稿|0 条评论| 作者张俊林 SDCC算法架构大数据京东腾讯 摘要:11月21日,为期三天的SDCC ...

  7. 实时通信服务中的语音解混响算法实践

    导读: 随着音视频通信会议越来越普及,与会各方在不同环境中遇到了越来越明显且差异的混响场景,譬如大会议室场景.玻璃会议室场景和小房间且隔音材料不佳场景等.为了保证更好的听音可懂度和舒适度,通信中的语音 ...

  8. 1.Python算法之枚举算法

    1.什么是枚举算法?  枚举算法也叫穷举算法,最大特点是在面对任何情况时会尝试每一种解决方法.在进行归纳推力时,如果逐个考察了某类事件的所有可能情况,因而得出一般结论,那么这个结论是可靠的,这种归纳方 ...

  9. 阿里妈妈品牌广告中的 NLP 算法实践

    导读:本次分享的主题为阿里妈妈品牌广告中的 NLP 算法实践,主要内容包括: 1. 品牌广告业务模式与技术架构的简要介绍 2. NLP 算法在品牌搜索广告中的实践,以两个具体的算法问题展开:品牌意图识 ...

最新文章

  1. 阿尔伯塔大学博士毕业论文:基于图结构的自然语言处理
  2. 有关RSA 命令总结
  3. 微软雷德蒙德和伦敦地区掀起新一轮裁员 涉及数百人
  4. 必须要用发展的眼光来看诺基亚和微软的合作
  5. SDNU 1406.A+B问题(水题)
  6. 简明 Python 教程学习笔记_7_文件操作(os、shutil、pathlib )
  7. body里写注释 postman_是时候扔掉 Postman 了,试试 IntelliJ IDEA 自带的高能神器!
  8. git配置中文乱码_解决git中文乱码问题
  9. STM32CubeMx配置H7时钟: Frequency searched for is out of range for this vos range
  10. leecode第三十题(串联所有单词的子串)
  11. 去除右键菜单中图形属性、图形选项
  12. 芒果广告不能用百度了,怎么办?
  13. vscode下报错:No such file or directory fatal error:no input files的一种比较坑爹的可能
  14. ApowerREC v1.5.6.2 最佳屏幕录像机
  15. isolated copper:split plane(dgnd) on ground,dead copper delected.copper area is: 2.5e2 sq.mils
  16. ROS小车PS2遥控器的使用注意事项
  17. 32位CPU最大支持4G内存
  18. java并发包JUC
  19. Nsight system(nsys)
  20. 了解lammps中NVE/NVT/NPT三种系综的特性和区别

热门文章

  1. Table固定列和表头
  2. SpringBoot实现幕课网在线学习系统
  3. nz-select 选择器
  4. C语言程序设计第五章循环结构程序设计总结
  5. 大数据智能分析解决方案
  6. API 测试利器 WireMock
  7. snmp trap安装配置
  8. java什么是网络接口_Java语言:什么叫面向接口编程(来自网络)
  9. 十二星座日期、性格、特性查询表
  10. Orace登录及建库