首页 > 其他 > 详细

洛谷 P1182 数列分段`Section II`【二分答案】

时间:2018-07-24 17:26:47      阅读:249      评论:0      收藏:0      [点我收藏+]

技术分享图片

【代码】:

#include<bits/stdc++.h>

const double eps = 1e-8;
const int maxn = 1e6+5;
#define inf 0x3f3f3f3f
#define ll long long
using namespace std;
int n,m;
int a[maxn];

int check(int x)
{
    int sum = 0, cnt = 1;//r是划分的段数,所以要从1开始(相当于植树问题啦)
    for(int i=1; i<=n; i++)
    {
        if(sum+a[i] > x)
        {
            sum = a[i];
            cnt++;
        }
        else sum+=a[i];
    }
    return cnt > m;
}
int slove(int L,int R)
{
    int mid,ans;
    while(L<=R)
    {
        mid = (L+R)/2;
        if(check(mid)) L = mid + 1;
        else R = mid - 1,ans=mid;
    }
    return ans;
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        int L=0,R=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            L = max(L, a[i]);
            R += a[i];
        }
        cout<<slove(L,R)<<endl;
    }
}
/*
5 3
4 2 4 5 1
6
*/

洛谷 P1182 数列分段`Section II`【二分答案】

原文:https://www.cnblogs.com/Roni-i/p/9360490.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!