说明
徐老师是某工地的计算工程师。工地现有 n 根钢管,第 i 根钢管的长度为 ai。
现在想用这 n 根钢管来做一个支撑用的柱子。我么可以切割这些钢管成为更短的钢管,但是不能缝合两根钢管。为了安全起见,柱子必须用 至少 k 根长度相同的钢管加上混凝土制成,并且要求钢管长度必须为 整数。
徐老师想知道,这个柱子最高能建成多高(钢管可以有剩余)。
输入格式
输入第一行一个整数 n, k (1 <= n, k <= 10000)。
接下来一行输入 n 个空格隔开的整数 li(1 <= l_i <= 10^8),表示每根钢管的长度。
输出格式
输出最大的高度。
样例
输入数据 1
2 4
8 4
Copy
输出数据 1
2
题解:
#include<bits/stdc++.h>
using namespace std;
int n,m,mix;
int a[100000];
//判断钢管为n时能否切m个
bool check(int x){
int s=0;
for(int i=0;i<n;i++){
s+=a[i]/x;
}
if(s>=m) return true;
else return false;
}
int main(){
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>a[i];
}
int Max=0;
for(int i=0;i<n;i++){
Max=max(a[i],Max);
}
int l=1,r=Max,mid=0;
while(l<=r){
mid=(l+r)/2;
// 若mid可以,往上找
if(check(mid)){
mix=mid;
l=mid+1;
// cout<<mid<<" ";
}
else {
r=mid-1;
}
}
cout<<mix;
return 0;
}