1 条题解

  • 4
    @ 2026-4-21 20:07:47
    #include<bits/stdc++.h>
    using namespace std;
    int n,m,l,r,a[30010];
    bool check(int mid)
    {
    	int s=0,c=0;//s:目前总和,c:分了几组
    	for(int i=1;i<=n;i++)
    	{
    		s+=a[i];//每次累加
    		if(s>mid)
    		{
    			c++;
    			s=0;
    		}//若比最小体力和大,更新组数,总和清0
    	}
    	return c>=m;//组数比m大,可以压缩;比m小,这个最小体力和不成立
    }
    int main()
    {
    	cin>>n>>m;
    	for(int i=1;i<=n;i++)
    	{
    		cin>>a[i];
    		r+=a[i];//r边界:所有人体力之和(所有人分一组的情况
    	}
    	while(l<r)
    	{
    		int mid=(l+r+1)/2;
    		if(check(mid))l=mid;
    		else r=mid-1;
    	}//二分模板
    	cout<<l+1;//本人也不知道为什么要加1
    	return 0;
    }
    
    • 1

    信息

    ID
    669
    时间
    1000ms
    内存
    256MiB
    难度
    5
    标签
    递交数
    112
    已通过
    44
    上传者