1 solutions

  • 1
    @ 2025-11-10 17:24:12
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    const int N=1e5+10;
    LL a[N];
    LL n,k;
    bool check(LL mid)
    {
    	LL s=a[1],cnt=1; //第一段 
    	for(int i=2;i<=n;i++) //枚举每个样本 
    	{
    		if(s+a[i]+1<=mid) //可以放到当前段 
    		{
    			s+=a[i]+1;
    		}
    		else //新开一段 
    		{
    			s=a[i];
    			cnt++;
    		}
    	}
    	if(cnt<=k) return true;
    	return false;
    }
    int main()
    {
    	cin>>n>>k;
    	LL l=0,r=n; //下界是最高的样板长度,上界是总和 
    	for(int i=1;i<=n;i++)
    	{
    		cin>>a[i];
    		l=max(l,a[i]);
    		r+=a[i];
    	}
    	while(l<r)
    	{
    		LL mid=l+r>>1;
    		if(check(mid)) r=mid;//说明mid可以,且答案一定在mid或mid左边 
    		else l=mid+1; //说明mid不可以,答案一定在mid右边 
    	}
    	cout<<l;
    	return 0;
    }
    
    • 1

    Information

    ID
    1941
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    5
    Tags
    # Submissions
    16
    Accepted
    4
    Uploaded By