九度1502



/*

 簡單二分
 
*/

#include 
#include 
#include 
using namespace std;

const int maxn = 100000 + 10;
int data[maxn] , n, k;

bool check(int x){
    int now = 0;
    for(int i = 1 ; i<= k; ++ i){
        int sum = data[++ now];
        if(sum > x) return false;
        while(sum + data[now + 1] <= x && now < n){
            sum += data[++now];
        }
        if(n == now)    return true;
    }
    return false;
}
int main(){
    //freopen("in","r",stdin);
    int cas;
    scanf("%d",&cas);
    while(cas --){
        scanf("%d%d",&n,&k);
        int sum = 0;
        for(int i = 1 ;i <= n; ++ i){
            scanf("%d",&data[i]);
            sum += data[i];
        }
        int l = 0, r = sum, ans = sum;
        while(l <= r){
            int mid = (l + r) >> 1;
            if(check(mid)){
                r = mid - 1;
                ans = mid;
            }
            else l = mid + 1;
        }
        printf("%d\n",ans);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章