木材加工

题目背景

要保护环境

题目描述

木材厂有 Luogu P2440 题解_数据 根原木,现在想把这些木头切割成 Luogu P2440 题解_数据_02 段长度Luogu P2440 题解_数据_03

当然,我们希望得到的小段木头越长越好,请求出 Luogu P2440 题解_数据_03

木头长度的单位是 Luogu P2440 题解_i++_05,原木的长度都是正整数,我们要求切割得到的小段木头的长度也是正整数。

例如有两根原木长度分别为 Luogu P2440 题解_1024程序员节_06Luogu P2440 题解_i++_07,要求切割成等长的 Luogu P2440 题解_1024程序员节_08 段,很明显能切割出来的小段木头长度最长为 Luogu P2440 题解_i++_09

输入格式

第一行是两个正整数 Luogu P2440 题解_ios_10,分别表示原木的数量,需要得到的小段的数量。

接下来 Luogu P2440 题解_数据 行,每行一个正整数 Luogu P2440 题解_1024程序员节_12,表示一根原木的长度。

输出格式

仅一行,即 Luogu P2440 题解_数据_03

如果连 Luogu P2440 题解_1024程序员节_14 长的小段都切不出来,输出 ​​​0​​。

样例 #1

样例输入 #1

3 7
232
124
456

样例输出 #1

114

提示

数据规模与约定

对于 Luogu P2440 题解_数据_15 的数据,有 Luogu P2440 题解_i++_16Luogu P2440 题解_i++_17Luogu P2440 题解_数据_18

// Author: PanDaoxi
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int INF = 1e5 + 1;
int n, k, l, r, mid, a[INF];

bool check(int t){
/*
我们要求出每根棍按t截出来的数量
然后和k作比较
如果q >= k ===> true
否则 ===> false
*/
int q = 0;
for(int i=1; i<=n; i++){
q += a[i] / t;
}
return q >= k;
}

signed main(){
ios :: sync_with_stdio(false);

cin >> n >> k;
l = 0, r = INT_MIN;
for(int i=1; i<=n; i++){
cin >> a[i];
r = max(r, a[i]);
}

while(l <= r){
mid = (l+r) / 2;
if(mid != 0){
if(check(mid)){
l = mid + 1;
}
else{
r = mid - 1;
}
}
else{
cout << 0;
return 0;
}
}
cout << r;

return 0;
}

P2440题解