这是一道二分答案算法题,洛谷标签中的贪心等完全用不到。


这道题的数据范围较大,所以保险起见,整型的数据我们都开成longlong

题意很好理解,这里就不做过多的分析了,直接看代码,后面有注释:

#include<bits/stdc++.h>
using namespace std;
long long n,k,l,a[1000010],maxn,ans;
bool wood(long long  x){
    long long cnt=0;
    for(int i=1;i<=n;i++){
        cnt+=a[i]/x;
        //看看每根木材按照设定长度可以截几段 
    }
    return cnt>=k;//判断此时设定的长度能否符合要求 
}

int main(){
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    } 
    sort(a+1,a+n+1);//先排好序,方便比较(其实无所谓)
     
    long long l=0,r=1e9+1,mid;//l赋极小值,r赋极大值 
    while(l+1<r){
        mid=(l+r)/2;//mid赋l与r的中间值,用以二分 
        if(wood(mid)){
        //将mid带入函数,如果返回为真,说明符合条件,可以将长度增大 
        //    cout<<l<<" "<<r<<endl;
            l=mid;
            ans=mid;
        }
        else {
            r=mid;
            //cout<<l<<" "<<r<<endl;
        }
    }
    
    printf("%lld",ans);//数据类型longlong的输出方式。 
    return 0;
}