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;
    }
  • 相关阅读:
    adb命令之adb install
    GNU make and Makefile
    Makefile经典教程(掌握这些足够)
    Android.mk简介
    PhoneFactory.getDefaultPhone must be called from Looper thread
    Android源码目录结构
    软件部通用技术类网站名录
    β测试
    α测试
    白盒测试
  • 原文地址:https://www.cnblogs.com/gwj1314/p/9444780.html
Copyright © 2011-2022 走看看