1 条题解

  • 0
    @ 2026-8-18 15:06:13

    思路

    二分类问题有几个明显的特征: 1.具有单调性:如果对于一个数xx,它能够满足题目的要求,那么所有大于他(或者是小于他)的数也能满足要求。 2.求出满足条件的值很难,但是判断一个数是否满足条件简单。

    注意到这道题,如果你能让最大的木头长度为xx,那么对于所有的ii满足xix\leq i一定可以做到最长的木头长度为ii

    另外,如果已经知道最长木头的长度为xx,也很好判断是否可以再kk刀内解决。只需要假设所有的木头都长度为xx,计算每段木头要切几刀,最终判断即可。

    AC代码

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    const int N=2e5+10;
    int cel(int a,int b){return (int)(ceil(1.0*a/b));}
    int a[N],n,k;
    bool check(int x)
    {
    	int cnt=0;
    	for(int i=1;i<=n;i++)cnt+=cel(a[i],x)-1;
    	return cnt<=k;
    }
    signed main()
    {
    	scanf("%lld%lld",&n,&k);
    	for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
    	int l=1,r=1000000000,ans;
    	while(l<=r)
    	{
    		int mid=l+r>>1;
    		if(check(mid))r=mid-1,ans=mid;
    		else l=mid+1;;
    	}
    	printf("%lld\n",ans);
    	return 0;
    }
    
    • 1

    信息

    ID
    11944
    时间
    2000ms
    内存
    1024MiB
    难度
    10
    标签
    递交数
    2
    已通过
    2
    上传者