POJ 3273 Monthly Expense 最大值最小 二分法

#include<stdio.h>
#include <stdlib.h>
#include <string.h>

int s[112345];

int main()
{
    int n,m,i,low,high,mid,num,sum,z;
    while(~scanf("%d %d", &n, &m)){
        low = 0;
        high = 0;
        for(i = 0;i < n;i++){
            scanf("%d", &s[i]);
            if(low<s[i])    low = s[i];
            high +=s[i];
        }
        while(low <= high){
            mid = (low+high)/2;
            sum = 0;
            num =1;
            for(i = 0;i < n;i++){
                if(sum+s[i] <=mid){
                    sum+=s[i];
                }else {
                    sum = s[i];
                    num++;
                }
            }
            if(num > m){
                low = mid+1;
            }else {
                high =mid-1;
                z = mid;
            }
        }
        printf("%d\n", z);
    }

    return 0;
}

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