P1182 数列分段Section II

来源:互联网 发布:json转换为java对象 编辑:程序博客网 时间:2024/05/19 16:33
/*80分做法 题型:二分注意:范围为l<=r,左右区间注意。 */ #include <bits/stdc++.h>//万能头文件using namespace std;int n, m, x, f[100001], p, l, r, mid, sum, ans;//f数组前缀和,sum为分割数列的段数,ans为最终答案int main(){    scanf ( "%d %d", &n, &m );    for ( int i = 1; i <= n; i++ )    scanf ( "%d", &x ), f[i] = f[i-1] + x;//前缀和    l = 1, r = f[n];//定义二分的区间    while ( l <= r ){        mid = ( l + r ) >> 1;//二分套路不解释        p = 1, sum = 1;//初始就有1段,p为当前分段位置        for ( int i = 2; i <= n; i++ ){            if ( f[i] - f[p-1] > mid )//如果第i~p-1个数的和大于mid            p = i, sum++;//当前位置为i,段数+1        }        if ( sum > m ) l = mid + 1;//如果段数大于m,搜后半段        else r = mid - 1, ans = mid;//符合要求,把mid赋值给ans,搜前半段    }    printf ( "%d\n", ans );//输出答案    return 0;} 


原创粉丝点击