洛谷P1182 数列分段 Section II(二分+贪心)

题意跳转

分析:这个题要求最大值最小,且答案区间和的上限具有单调性,所以依然是一道二分答案的题,判断答案依然用到贪心算法

答案的最小值即最小上限时序列中最大的那个数字,最大值是序列和。

如果答案合法,就找寻更小的答案,如果答案不合法,就找寻更大的答案。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define maxn 100005

using namespace std;

int  num[maxn],n,m;

inline bool check(int d)
{
    int cnt=0,sum=0;
    for(int i=1;i<=n;i++)
        if(sum+num[i]<=d) sum+=num[i];
        else sum=num[i],cnt++;
    if(cnt>=m) return false;
    else return true;
}

int main()
{
    scanf("%d%d",&n,&m);
    int l=0,r=0;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&num[i]);
        r+=num[i];
        l=max(l,num[i]);
    }
    while(l<=r)
    {
        int mid=(l+r)>>1;
        if(check(mid)) r=mid-1;
        else l=mid+1;
    }
    printf("%d
",l);
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/Hoyoak/p/11354580.html