Andysun06的博客

  • 首页
  • 文章列表 
  • 博客统计
  • 个人中心
Andysun06的博客
  1. 首页
  2. C++语言
  3. 正文

【YBTOJ】二分例题1——数列分段

2021年10月6日 163点热度 1人点赞 1条评论

题目:

【YBTOJ】二分例题1——数列分段插图

题解

题意:
把一段数列分成 M 段,并且满足各段所有数的和的最大值是所有分段方法中最小的

做法:
用二分枚举答案,易证:每段和的最大值一定在 l\~r 范围内( l 是数组中的最大值,r 是数组里所有数的和)
定义一个变量 mid 如果每段和的最大值最小为 mid 看能否分成 M 段,如果可以,在 l\~mid 里继续搜索,否则在 mid+1\~r 里
直到 l\=\=r 就是答案

#include<iostream>
#include<cstdio>
using namespace std;
int l,r,a[100005],m,n;
bool check(int x){
    int cnt(1),sum(0);
    for(int i=1;i<=n;++i){
        if(sum+a[i]<=x){  //判断能否分成一段
            sum+=a[i];
        }else{
            sum=a[i];
            cnt++;  //另开一段
        }
    }
    return cnt<=m;  //能否满足
}
int main() {
    cin>>n>>m;
    for(int i=1; i<=n; ++i) {
        scanf("%d",&a[i]);
        l=max(l,a[i]);
        r+=a[i];
    }
    while(l<r) {
        int mid=(l+r)/2;
        if(check(mid)){
            r=mid;
        }else{
            l=mid+1;
        }
    }
    cout<<l;
}
本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: C++ YBTOJ 信息奥赛 原创 总结 笔记 题解
最后更新:2021年10月23日

Andysun06

王帅加油!!!

打赏 点赞
< 上一篇
下一篇 >

文章评论

  • Twicsy

    Great beat ! I wish to apprentice even as you amend your website, how can i subscribe for a weblog web
    site? The account aided me a acceptable deal.
    I had been tiny bit acquainted of this your broadcast provided
    shiny transparent idea

    2022年7月1日
    回复
  • 取消回复

    COPYRIGHT © 2021 hackingfans.top. ALL RIGHTS RESERVED.

    THEME KRATOS MADE BY VTROIS

    油
    加
    王
    帅