P1182 數列分段Section II

/*
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;
} 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章