广东恒力建设工程有限公司网站,互联网产品推广案例范文,会展设计是什么专业,网站收录后怎么做排名木材加工
题目背景
要保护环境
题目描述
木材厂有 n n n 根原木#xff0c;现在想把这些木头切割成 k k k 段长度均为 l l l 的小段木头#xff08;木头有可能有剩余#xff09;。
当然#xff0c;我们希望得到的小段木头越长越好#xff0c;请求出 l l l 的最大…木材加工
题目背景
要保护环境
题目描述
木材厂有 n n n 根原木现在想把这些木头切割成 k k k 段长度均为 l l l 的小段木头木头有可能有剩余。
当然我们希望得到的小段木头越长越好请求出 l l l 的最大值。
木头长度的单位是 cm \text{cm} cm原木的长度都是正整数我们要求切割得到的小段木头的长度也是正整数。
例如有两根原木长度分别为 11 11 11 和 21 21 21要求切割成等长的 6 6 6 段很明显能切割出来的小段木头长度最长为 5 5 5。
输入格式
第一行是两个正整数 n , k n,k n,k分别表示原木的数量需要得到的小段的数量。
接下来 n n n 行每行一个正整数 L i L_i Li表示一根原木的长度。
输出格式
仅一行即 l l l 的最大值。
如果连 1cm \text{1cm} 1cm 长的小段都切不出来输出 0。
样例 #1
样例输入 #1
3 7
232
124
456样例输出 #1
114提示
数据规模与约定
对于 100 % 100\% 100% 的数据有 1 ≤ n ≤ 1 0 5 1\le n\le 10^5 1≤n≤105 1 ≤ k ≤ 1 0 8 1\le k\le 10^8 1≤k≤108 1 ≤ L i ≤ 1 0 8 ( i ∈ [ 1 , n ] ) 1\le L_i\le 10^8(i\in[1,n]) 1≤Li≤108(i∈[1,n])。 思路
函数check()用来判断当前长度x是否满足条件即根据当前长度可以切割出至少k个长度为x的木棍。在check()函数中遍历所有木棍将每个木棍的长度除以x然后求和得到切割出的木棍数量。如果切割出的数量大于等于k则返回true否则返回false。
在主函数中定义变量l和r分别表示长度范围的左右边界。开始时左边界l为0右边界r为1e8 7。
使用二分查找的思想当左边界l和右边界r相差1时即l 1 r时进行循环。每次循环计算中点mid然后调用check()函数判断mid是否满足条件。
如果mid满足条件则更新左边界l为mid因为要找的长度肯定要比mid更大才能满足条件。
如果mid不满足条件则更新右边界r为mid因为要找的长度肯定要比mid更小才能满足条件。
最后输出左边界l即为满足条件的最大长度。 AC代码
#include iostream
#define ll long long
using namespace std;const int N 1e6 7;int n, k;
int l[N];bool check(int x) {ll sum 0;for (int i 1; i n; i) {sum l[i] / x;}// cout x sum endl;return sum k;
}int main() {cin n k;for (int i 1; i n; i) {cin l[i];}int l, r;l 0;r 1e8 7;while (l 1 r) {int mid (l r) / 2;if (check(mid)) {// 偏短l mid;} else {// 偏长r mid;}}cout l endl;return 0;
}