题目链接:

木材加工 - 洛谷https://www.luogu.com.cn/problem/P2440

非常简单的题目,用left和right控制二分边界,ans一开始是0,每次check到符合题意结果都更新ans的值,看起来没有任何问题。

但是我当时写的时候re了,看了半天也没看出问题。后来队友帮我debug,才发现是边界处理不到位。左边界left一开始设置成了0而不是1,导致了 /0的错误。

收获:

1.re不一定是数组越界,还有可能是 /0错误。

2.学习到了一些debug技巧,打印ans日志的时候,发现少输出了一个数,是因为最后一次ans计算的时候出现 /0错误,导致中断了,我由此发现了这个问题。

以下是修改之后的ac代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5+5;
ll len[maxn];
ll n, k;bool check(int mid){ll ans = 0;for(int i=1; i<=n; i++){ans += len[i]/mid;}if(ans >= k) return true;else return false;
}
int main(){cin >> n >> k;//特别注意这里的left要设为1,不能是0,否则check函数中会出现 /0 的错误//右边界设为0没有关系,因为如果一直是0,后面进入不了while循环,不会出问题ll left = 1, right = 0;for(int i=1; i<=n; i++){cin >> len[i];right = max(right, len[i]);}ll ans = 0;while(left <= right){int mid = left + (right-left)/2;if(check(mid)) {left = mid+1; ans = mid;}else right = mid-1;}cout << ans << endl;
}

---------------------------------------------------------------------------------------------------------------------

第二天补充:也可以用 left < right 型二分, 省去ans变量,最后返回的就是left,但是这么写要注意特判,尽管left不能设置为0,但答案有可能是0。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5+5;
ll len[maxn];
ll n, k;bool check(int mid){ll ans = 0;for(int i=1; i<=n; i++){ans += len[i]/mid;}if(ans >= k) return true;else return false;
}
int main(){cin >> n >> k;ll left = 1, right = 0;for(int i=1; i<=n; i++){cin >> len[i];right = max(right, len[i]);}if(!check(1)) {cout<<0<<endl; return 0;} //特判,输出0的情况while(left < right){int mid = left + (right-left+1)/2;if(check(mid)) {left = mid;}else right = mid-1;}cout << left << endl;
}

洛谷 P2440 木材加工(二分,含边界处理的笔记)相关推荐

  1. 洛谷 P2440 木材加工 (二分答案)

    P2440 木材加工 题意 给定N个木头及其长度,要求把这些木头切割成M块长度相同的小段木头(木头有可能有剩余),求小段木头的最大值. 比如:有两木头长度为 11 和 21, 要求切成 6 块, 那么 ...

  2. 二分答案——洛谷P2440木材加工

    题目描述 问题分析 这个题目是一类典型的二分答案问题,题目中给出我们需要将给定的长度切割成相应的K段,并且保证切割的小段的最大长度,那么我们怎么做呢,必然是在一定的区间枚举出来该切成多少才能满足切成k ...

  3. 洛谷——P2440 木材加工

    https://www.luogu.org/problem/show?pid=2440#sub 题目背景 要保护环境 题目描述 题目描述: 木材厂有一些原木,现在想把这些木头切割成一些长度相同的小段木 ...

  4. 二分答案——木材加工(洛谷 P2440)

    题目选自洛谷P2440 读完题目后应该有个大致思路,看得出来是二分查找的题. 首先我们输入 n 和 k 并且运用二分找到合适的尺寸,而l 必须要足够小,r 必须要足够的大.题中写道数组中的数最大不会超 ...

  5. 洛谷P2240木材加工

    题目链接 洛谷P2240 题目描述 木材厂有 n根原木,现在想把这些木头切割成 k 段长度为l的小段木头(木头有可能有剩余). 当然,我们希望得到的小段木头越长越好,请求出 l的最大值. 木头长度的单 ...

  6. 洛谷P1873-砍树(二分答案)

    题目描述: 伐木工人米尔科需要砍倒M米长的木材.这是一个对米尔科来说很容易的工作,因为他有一个漂亮的新伐木机,可以像野火一样砍倒森林.不过,米尔科只被允许砍倒单行树木. 米尔科的伐木机工作过程如下:米 ...

  7. 【洛谷】【二分答案+最短路】P1462 通往奥格瑞玛的道路

    在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量有一天他醒来后发现自己居然到了联盟的主城暴风城在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛 题目背景 [题目描述:] 在艾泽拉斯 ...

  8. 二分答案——跳石头(洛谷 P2678)

    题目选自洛谷P2678 这道题题目并不复杂,思考一下也能知道用二分的方法来做. 难点在于如何判断是否满足条件,以及二分的边界问题. 下面给出详细解题思路: //tot表示需要搬走的石块数量,i表示找的 ...

  9. 算法设计 - 二分法和三分法,洛谷P3382

    二分法 二分查找:找目标值位置 二分法是一种适用于特殊场景下的分治算法. 这里的特殊场景指的是,二分法需要作用在一个具有单调性的区间内. 比如,我们熟知的二分查找,就是一种二分法的具体实现,二分查找必 ...

最新文章

  1. matlab 读取txt文件数据
  2. C#导出Excel和相关打印设置
  3. Python中文分词--jieba的基本使用
  4. 成功解决ValueError: fill value must be in categories
  5. 基于DSP技术的多路语音实时采集与压缩处理系统
  6. 拨云见日—深入解析Oracle TX 行锁(上)
  7. 前后端分离报错The Token’s Signature resulted invalid when verified using the Algorithm: HmacSHA256
  8. 页面缓存导致数据错误
  9. 招博后,比利时鲁汶大学 A2H 部计算机视觉动物行为分析方向
  10. Linux 软件看门狗 watchdog 喂狗
  11. solr dih mysql 注意事项
  12. [Swift]LeetCode212. 单词搜索 II | Word Search II
  13. 用信号量实现进程互斥、同步、前驱关系
  14. GRE_××× 配置(建议选择Cisco2811路由器)
  15. 超全整理——相机标定知识汇总
  16. 问道服务器etc修改教程,常用的修改etc对照表-详细版
  17. oracle rac定时清理归档日志,Rman 定时删除归档日志
  18. 使用keep-live组件无法销毁cesium的view
  19. 7-35 英文字母的大小写转换
  20. 多模态,感知,认知,推理

热门文章

  1. 一文带你看透 Chrome 浏览器架构
  2. 【Linux】centos解压缩rar
  3. uni-app优秀的Ui模板和项目案列
  4. errorCode 1045,state 28000: Access denied for user 'mysql'@'localhost' (using password: YES)
  5. Python机器学习笔记之pandas绘图
  6. HTTP和QUIC协议以及HTTPS——学习笔记
  7. golang直接调用ffmpeg预编译类库(windows)
  8. ThinkPad T460s BIOS设置实现U盘启动
  9. 探讨内容付费的本质和趋势
  10. Java Idea设置运行内存大小(开发必备)