二分(洛谷-P1182)

#include<stdio.h>
#include<algorithm>
#include<iostream>

using namespace std;
int a[100005];
int n , m;
int high, low = 0;
bool check(int flag)
{
    int sum = 0 ;
    int cnt = 1;//第一段
    for(int i = 1 ; i <= n ; i ++)
    {
        sum += a[i];
        if(sum > flag)
        {
            cnt ++;
            sum = a[i];//每一段的开头
        }
    }
    if(cnt > m)
        return true;
    else
        return false;
}
int main(void)
{
    cin>>n>>m;
    for(int i = 1 ; i <= n ; i ++)
    {
        cin>>a[i];
        low = max(low, a[i]);
        high += a[i];
    }
    while(low < high)
    {
        int mid = (low + high) / 2;
        if(check(mid))
        {
            low = mid + 1;
        }
        else
        {
            high = mid;
        }
    }
    cout<<low<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Zenith_Habitant/article/details/82747814
今日推荐