废话不多说AC如下
#include<bits/stdc++.h>
typedef long long int ll;
int get_num(int a[],int n,int mid);
using namespace std;
int main()
{
int MJ,MK;
cin>>MJ>>MK;
int a[MJ+1];
for(int i=1;i<=MJ;i++)
{
cin>>a[i];
}
int sum=0;
int Max=*max_element(a+1,a+MJ+1);
int left=1,right=Max;
int res=1;
while(left<=right)
{
int mid=(left+right)/2;
if(get_num(a,MJ,mid)>=MK)
{
res=mid;
left=mid+1;
}
else
{
right=mid-1;
}
}
if(right==0)
{
cout<<0;
}
else
{
cout<<res<<endl;
}
return 0;
}
int get_num(int a[],int n,int mid)
{
int sum=0;
for(int i=1;i<=n;i++)
{
sum+=a[i]/mid;
}
return sum;
}
题要用二分来做,思路相对简单。题目中说在满足切割后的木头等于K时,尽可能切割出长一点的木头(这很关键)。所以要从最长的木头来开刀,记录每次满足条件要求的结果,最后使用left>right 时就退出循环