现有n根木棍,第i根木棍的长度为a[i],有一台切割机,最多可以切割m次,每次切割可以选择一根木棍,将它分成两根整数长度的木棍,问所有切割方法中,所有木棍长度最大值的最小值是多少。
Input
第一行一个数T表示共有T组数据,每组数据满足 第一行两个整数n,m,表示木棍数目和最大切割次数(1<=n,m<=100000) 第二行包含n个整数,第i个数a[i]表示第i根木棍的长度(1<=a[i]<=100000)
Output
共T行,每行一个数,表示如题所述的答案
Sample 1
Inputcopy | Outputcopy |
---|---|
1 2 2 1 3 | 1 |
#include<bits/stdc++.h>
#define endl '\n'
#define ll long long
#define int ll
using namespace std;
const int N=1e6+7;
const int M=2e3+7;
int a[N];
signed main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int T; cin>>T;
while(T--)
{
memset(a,0,sizeof a);
int n,m;
cin>>n>>m;
int max1=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
max1=max(max1,a[i]);
}
int l=1,r=max1;
while(l<r)
{
int sum=0;
int mid=(l+r)/2;
for(int i=1;i<=n;i++)
{
sum+=(a[i]-1)/mid;
}
if(sum<=m) r=mid;
else l=mid+1;
}
cout<<l<<endl;
}
return 0;
}