zoukankan      html  css  js  c++  java
  • 【Luogu1182】数列分段Section II(二分)

    problem

    • 一个长度为N的正整数数列A[i]
    • 将其分成M段,并要求每段连续
    • 求每段和最大值(M段各自的和中最大的那个)最小(某种方案下最小)。

    solution

    二分每段和的最大值mid。
    如果存在一种划分方案使得每段和为mid成立,就去找更小的。反之找更大的。

    !!!第4个点WA的:二分答案进行检查的时候要判断当前的数字是不是大于二分出来的答案,如果大于,就直接特判掉。

    codes

    #include<iostream>
    using namespace std;
    int n, m, a[100005];
    int check(int x){
        int sum = 0, cnt = 1;
        for(int i = 1; i <= n; i++){
            if(a[i]>x)return false;//特判
            sum += a[i];
            if(sum > x){//这里是>;==的时候不行(sum不可以直接等于a[i]啊)。
                cnt++;
                sum = a[i];
            }
        }
        return cnt<=m;
    }
    int main(){
        cin>>n>>m;
        for(int i = 1; i <= n; i++)cin>>a[i];
        int l = 1, r = (int)1e9;
        while(l < r){
            int mid = l+r>>1;
            if(check(mid))r = mid;
            else l = mid+1;
        }
        cout<<l<<'
    ';
        return 0;
    }
  • 相关阅读:
    四则运算2
    进度条博客
    随机生成30道100以内的四则运算题
    构建之法阅读笔记01
    自我介绍
    c# dataGridView cell添加下拉框
    Winform Combobox.Items tooltip
    中医和红外(北京第一个工作)
    pdf修复
    c# 导出数据到excel
  • 原文地址:https://www.cnblogs.com/gwj1314/p/9444780.html
Copyright © 2011-2022 走看看