洛谷P1182-数列分段(详解)

2023-11-11

题目

给定一个长度为n的数列A,要求将它分为m段,要求每段连续,且每段和的最大值最小。N<=10e5,m<=n,Ai之和不超过10e9。

这题一看就知道我不会。所以很老实的去看了看题解。题解也真是避重就轻,重要的地方就说:这个要自己思考一下……

好吧,还好有代码。讲讲我自己的理解。

首先这个数字最大值一定存在(既然存在那一定找得到,即使有时候错过了,最后也还是会找回来。这个题是贪心+二分。先上代码,


    #include<iostream>
    using namespace std;
    typedef long long ll;
    int n, m;
    ll q[100002];
    ll sum;
    ll maxn;
    int l, r;
    int res = 0, cnt = 1;  //每个段的总和以及被分的段的总数
    inline bool check(int mid) {
        for (int i = 0;i < n;i++) {
            if (res + q[i] <= mid) res += q[i];
            else { res = q[i];cnt++; }
        }
        return cnt > m;     //重点
    }
    
    int main() {
        cin >> n >> m;
        for (int i = 0;i < n;i++) {
            cin >> q[i];
            if (maxn < q[i]) maxn = q[i];
            sum += q[i];
        }
        l = maxn;r = sum;
        while (l <= r) {
            res = 0;cnt = 1;
            int mid = (l + r) / 2;
            if (check(mid)) l = mid + 1;
            else r = mid - 1;
        }
        cout << l;
        return 0;
    }

首先考虑要寻找的答案,即最小的段最大值。它一定介于这个数列的最大值和整个数列和之间。因为数列中的最大值在被分段时,它所在的段和一定>=它,临界条件是=它,如果只要分一段,那自然是总和。

这段代码的check函数是重点,用二分法来寻找这个最小的最大和,mid用来判断与要求的数的方位。它里面对数列a进行分段,求每段的总和。要求分的段数必须是m,所以我用cnt来标记它被分的段数。在未经分段的时候,cnt初始化1,代表一整个数列一段。最后的return cnt>m的意思是:

1. 如果分段数目比要求的数目多(每段和<=mid),即代表这个mid选小了,目标数在它的左边,返回为1->执行左区间变化为mid+1。
2. 如果分段数目比要求的数目少,即代表这个mid太大了(每个段的数据多),目标数在它的右边,返回0->执行右区间变化mid-1。
3. 如果刚好等于呢?也并不能说就找到了答案,因为要求段和最大值最小,就必须贪心到最小,要往左边看看是否有更小的满足条件,所以变化左区间,与1一样。(当然也有可能就是要找的答案,这步还是会执行,但是答案不会有问题,顶多多几步操作)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

洛谷P1182-数列分段(详解) 的相关文章

随机推荐

  • Kanzi学习教程培训教程-Kanzi的简介和安装

    如果你认为本系列文章对你有所帮助 请大家有钱的捧个钱场 点击此处赞助 赞助额1元起步 多少随意 锋影 e mail 174176320 qq com Kanzi UI Solution是一个完整的UI解决方案 为嵌入式的UI的设计 开发和部
  • QLineEdit 设置输入掩码

    背景 QLineEdit 是单行文本编辑器 常用于界面中的文本输入 QLineEdit 提供了 inputMask 使用一些特定到字符来设置输入的格式和内容 inputMask 概述 输入掩码包括两部分组成 之前是输入格式及占位符设置 之后
  • pytorch的学习

    torch save net1 net pkl 保存entire net整个网络 torch save net1 state dict net params pkl 保存参数
  • MySQL5.7忘记root密码-手动修改密码教程

    MySQL 5 7相对于MySQL 5 6在应用上发生了一些新的变化 这里就MySQL5 7忘记root密码情况下 手动去修改root密码做一些介绍 操作系统 Windows10 数据库版本 MySQL 5 7 20 1 Windows10
  • TCL中变量嵌套使用

    TCL中变量嵌套使用 在使用多重嵌套变量时候 因为 对于tcl来说属于非运算符号 因此在使用变量嵌套 直接调用会出现问题 即变量不能正确调用 set mm list 0 1 set nn list 2 3 set index mm puts
  • 憨批的语义分割重制版5——Keras 搭建自己的Unet语义分割平台

    憨批的语义分割重制版5 Keras 搭建自己的Unet语义分割平台 注意事项 学习前言 什么是Unet模型 代码下载 Unet实现思路 一 预测部分 1 主干网络介绍 2 加强特征提取结构 3 利用特征获得预测结果 二 训练部分 1 训练文
  • OC语言学习 (三) 成员变量get/set方法和“.”语法,@proterty和@synthesize关键字

    Person h objc view plain copy print ifndef oc Person h define oc Person h interface Person NSObject int age protected fl
  • 蓝桥杯第一期模拟赛 英文转换 C语言

    英文转换 问题描述 输入一个由小写英文字母组成的字符串 请将其中的元音字母 a e i o u 转换成大写 其它字母仍然保持小写 输入格式 输入一行包含一个字符串 输出格式 输出转换后的字符串 样例输入 lanqiao 样力输出 lAnqI
  • 印刷企业如何利用MES管理系统实现智能计划排产

    在数字化时代 印刷企业面临着日益激烈的市场竞争和不断攀升的成本压力 为了提高生产效率和质量 印刷企业需要采用先进的生产管理系统 其中 MES生产管理系统已成为实现智能计划排产的重要工具 本文将探讨如何利用印刷MES管理系统实现印刷企业的智能
  • 让你的群晖NAS支持DTS!

    由于版权群晖的video station不支持dts 所以我简单的说一下如何安装套件让其支持dts解码 下面只文字阐述 1 打开套件中心 点击设置 2 进入套件来源 新增 名称 SynoCommunity 位置 http packages
  • matlab_非线性优化

    求解非线性问题 min z f x s t c x 0 ceqx 0 Ax b Aeqx beq lb x ub fmincon函数 x fval exitflag output lambda grad hessian fmincon fu
  • linux svn版本管理命令

    1 svn merge回滚 1 先 svn up 保证更新到最新的版本 如2106 2 然后用 svn log 查看历史修改 找出要恢复的版本 如2105 如果想要更详细的了解情况 可以使用svn diff r 2105 2106 文件或目
  • GPU渲染管线之旅

    在这一部分中 我们来谈谈像素处理的前半部分 dispatch和实际的像素着色 事实上 这部分是大多数图形开发者在谈到PS stage时所关心的内容 有关alpha blend和Late Z的内容则会下一篇文章中去探讨 后面我们会看到 在硬件
  • Oauth2.0实现token刷新功能

    扣扣技术分享交流群 1125844267 1 Oauth3 0简介 Oauth2 0是一个授权协议 提供了一种解决用户资源共享问题的思路 它不是一种实现 对于java来说 我们可以利用Spring Security OAuth2来实现 Oa
  • 使用Anaconda 创建指定cuda 版本的虚拟环境

    目的 解决多cuda版本共存问题 首先是安装anaconda 从官网或者是清华源下载安装包 以下用 Anaconda3 2019 10 Linux x86 64 sh 举例 wget https mirrors tuna tsinghua
  • Pycharm 报错 “Could not find conda environment: torch“ 解决办法:通过Anaconda 配置 pytorch 环境

    问题 在 Pycharm 中运行 gt gt gt import torch 报错 Could not find conda environment torch 解决方法 在 pytorch 环境下安装 PyTorch 第一步 以管理员身份
  • 服务器2008装系统教程视频教程,2008服务器系统安装教程视频

    2008服务器系统安装教程视频 2021 02 13 22 34 39 简介 php去除nbsp的方法 首先创建一个PHP代码示例文件 然后通过 preg replace s nbsp xc2 xa0 strip tags val 方法去除
  • WPF 将TextBox更改为PasswordBox样式(文字显示方式为密码格式)

    样式代码
  • 移动应用开发之约束布局

    重点在于找死角区 约束布局在所有布局之中是功能最全 最便捷的布局 可以通过拖拽的方式来实现 由于我总是通过拖拽的方式 导致我看布局文件代码的时候 一脸懵逼 便将约束布局的各个属性整理了下来 父约束 一般值为parent 也可以是id 加id
  • 洛谷P1182-数列分段(详解)

    题目 给定一个长度为n的数列A 要求将它分为m段 要求每段连续 且每段和的最大值最小 N lt 10e5 m lt n Ai之和不超过10e9 这题一看就知道我不会 所以很老实的去看了看题解 题解也真是避重就轻 重要的地方就说 这个要自己思