二分 - bailian 4135:月度开销

题目链接

http://bailian.openjudge.cn/practice/4135/

解题分析

题目的意思是,从给的n天花销中划分成m个财政周期,这m个财政周期求其中最大的财政周期最小化。
如果这个题用枚举来做的话,对于这个最大最小财政周期 a 的取值范围[max, total],对范围内每一个整数做一次测试,测试它是否能满足每个划分不超过a,并且划分数要小于等于m。(比m小的划分还可以再拆一拆凑成m个划分,并且能够满足每个划分不超过a)。
如果可以尝试这个最大最小财政周期为a,那么比a大的最大最小财政周期都可以满足条件,如果使用二分法对a的可能取值范围进行查找,可以加快算法速度,不至于超时。

解题代码

//
//  main.cpp
//  4135:月度开销
//
//  Created by apple on 2020/3/30.
//  Copyright © 2020 apple. All rights reserved.
//

#include <cstdio>
#include <cstring>
#define MAX 100010

int a[MAX];
int n, m;
bool test(int);

int main(){
    int max = 0, total = 0;
    scanf("%d %d", &n, &m);
    for(int i = 0; i < n; i++){
        scanf("%d", a + i);
        if(max < a[i]) max = a[i];
        total += a[i];
    }
    
    int result;
    int l = max, r = tatal, m;
    while(l <= r){
        m = l + (r - l)/2;
        if(test(m)){
            result = m;
            r = m - 1;
        }
        else
            l = m + 1;
    }
    printf("%d\n", result);
    return 0;
}

bool test(int min){
    int sum = 0, month = 1;
    for(int i = 0; i < n; i++){
        if(a[i] + sum > min) {
            sum = a[i];
            month++;
        }
        else
            sum += a[i];
    }
    if(month <= m) return true;
    else return false;
}
posted @ 2020-03-30 17:24  zhangyue_lala  阅读(316)  评论(0编辑  收藏  举报