• 二分


    题目链接

    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
    ", 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;
    }
    
  • 相关阅读:
    samba安装和配置
    linux下打包命令的使用
    Linux目录结构简析
    Linux服务器的安装
    linux下定时任务设置
    创建表空间并授权
    selenium2.0(WebDriver) API
    selenium + python之元素定位
    Linux实战教学笔记13:定时任务补充
    Linux实战教学笔记11:linux定时任务
  • 原文地址:https://www.cnblogs.com/zhangyue123/p/12599854.html
Copyright © 2020-2023  润新知