Monthly Expense POJ3273
投稿日: 更新日:
問題:http://poj.org/problem?id=3273
問題
日間あり日目に必要な金額はです。個の予算を建てます。各予算は以上の連続する日を含みます。また、それぞれの日は1つの予算のみに含まれます。最も支出の多い予算の最小値を求めてください。
解法
最大の予算を以下とできるかを二分探索します。
何個の予算が必要になるかは貪欲に数えていきます。そして、個数が以下かを判定すれば良いです。
実装
#include <iostream>
#include <vector>
using namespace std;
int main(){
    int n, m;
    cin >> n >> m;
    vector<int> a(n);
    for(int i = 0;i < n; ++i){
        cin >> a[i];
    }
    int ok = 1e9 + 100, ng = 0;
    while(ok - ng > 1){
        int mid = (ok+ng)/2;
        int count = 1;
        int sum = 0;
        for(int i = 0;i < n; ++i){
            if(a[i] > mid){
                count = 1e9;
                break;
            }
            sum += a[i];
            if(sum > mid){
                count++;
                sum = a[i];
            }
        }
        if(count <= m){
            ok = mid;
        }else{
            ng = mid;
        }
    }
    cout << ok << endl;
    return 0;
}