木棒切割问题,给出N根木棒,长度已知,现在希望通过分割他们来得到至少K段长度相等的木棒(长度必须为整数),问这些长度相等的木棒最长能有多长
思路:运用二分法,求木棒的最大长度,为求第一个满足某条件的问题,由此联想到区间问题(点击链接查看),求右区间,为最大边界,然后减1即为最大值
#include<cstdio>
int a[101];
//思路:运用二分法
int countK(int N,int l)
{
int k=0;
for(int i=0;i<N;i++)
k+=a[i]/l;
return k;
}
int binarySolve(int N,int K)//K为要求的木棒个数
{
int mid;
int left=0,right=a[0];
for(int i=1;i<N;i++)
{
if(a[i]>right)
right=a[i];
}
while(left<right){
mid=(left+right)/2;
if(K>countK(N,mid))
right=mid;
else left=mid+1;
}
return left-1;
}
int main()
{
int n;
int K;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
scanf("%d",&K);
printf("%d\n",binarySolve(n,K));
return 0;
}