洛谷P1182数列分段

题目描述

对于给定的一个长度为 N 的正整数数列 A_{1-N},现要将其分成 M(M≤N)段,并要求每段连续,且每段和的最大值最小。

关于最大值最小:

例如一数列 4 2 4 5 14 2 4 5 1 要分成 33 段。

将其如下分段:

[4 2][4 5][1][4 2][4 5][1]

第一段和为 66,第 22 段和为 99,第 33 段和为 11,和最大值为 99。

将其如下分段:

[4][2 4][5 1][4][2 4][5 1]

第一段和为 44,第 22 段和为 66,第 33 段和为 66,和最大值为 66。

并且无论如何分段,最大值不会小于 66。

所以可以得到要将数列 4 2 4 5 14 2 4 5 1 要分成 33 段,每段和的最大值最小为 66。

输入格式

第 11 行包含两个正整数 N,M。

第 22 行包含 N 个空格隔开的非负整数 Ai​,含义如题目所述。

输出格式

一个正整数,即每段和最大值最小为多少。

输入输出样例

输入 #1

5 3
4 2 4 5 1

输出 #1

6

说明/提示

对于 20%20% 的数据,N≤10。

对于 40%40% 的数据,N≤1000。

对于 100%100% 的数据,1≤N≤105,M≤N,Ai​<10^{8}, 答案不超过 10^{9}

        这道题有了之前的经验,就能看出用二分答案比较合适。

        对于二分答案,我想谈谈自己的理解。所谓二分答案,就是“二分”和“答案”两部分,答案是对象,二分是手段,采用二分的手法对答案进行高级枚举。而二分就可以作为一种能够有效降低时间复杂度的一种枚举方法。而二分答案的难点并非二分的函数,而是验证二分出来的mid能不能符合题意的函数,我一般命名为check函数。对于这道题,我想主要讲一下写check函数的具体思路。

关于check函数,具体思路如下(建议配合代码食用):

        1.对于check函数,我要传什么参?我们最终输出的答案是最大值的最小,所以二分答案是对这些值的二分,左限定为0,右限定为输入所有数的和+1,传给check函数就是每次二分后的结果,即(l+r)/2,在check函数中我们定义为x。

        2.首先我定义了两个函数,一个now,一个cnt,now的值是当前遍历数组的下标,cnt是将数组分的段数,最终判断x值是否符合条件也是根据cnt判断的。

        3.整体思路就是,用now指针从零开始遍历数组,用sum记录每一段的总和,保证不超过m,一旦超过,break跳出循环,继续下次遍历,每次对分段时cnt++,在整个过程中,一旦cnt>m,reruen false;

bool check(int x){int now=0,cnt=0;while(now<n){int sum=0;now++;sum+=num[now];if(sum>x)return false;//如果第一个值就已经大于约定的值x了,那么这个值是注定不可以的,直接return掉就好了while(sum<x&&now<n){//保证每段之和小于m的同时now指针不越界now++;if(sum+num[now]<=x)sum+=num[now];//先试探一下,看看加上下一个元素会不会超过约定值,如果不超过sum直接加上,继续下次循环,如果超过了,记得把now归位,并且跳出循环else {now--;break;}if(sum==x)break;//如果sum刚好等于x了,也break}cnt++;//每一个小循环注定要多一段if(cnt>m)return false;}if(cnt<=m)return true;return false;
}

(代码不太美观)

整体代码如下:

//数列分段
#include "iostream"
using namespace std;
int n,m,all;
int num[100005];
bool check(int x){int now=0,cnt=0;while(now<n){int sum=0;now++;sum+=num[now];if(sum>x)return false;while(sum<x&&now<n){now++;if(sum+num[now]<=x)sum+=num[now];else {now--;break;}if(sum==x)break;}cnt++;if(cnt>m)return false;}if(cnt<=m)return true;return false;
}
int binary(){int l=0,r=all+1;while(l+1<r){int mid=(l+r)>>1;if(check(mid))r=mid;else l=mid;}return r;
}
int main(){cin>>n>>m;for(int i=1;i<=n;i++){cin>>num[i];all+=num[i];}int ans=binary();cout<<ans;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/541327.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

信雅纳网络测试的二次开发集成:XOA(Xena Open-Source Automation)开源自动化测试

目录 XOA是什么 XOA CLI XOA Python API ​XOA Python Test Suite/测试套件 XOA Converter Source Code XOA是什么 XOA&#xff08;Xena Open-Source Automation&#xff09;是一个开源的测试自动化框架&#xff0c;追求“高效、易用、灵活”的跨操作系统的开发框架。能…

细说C++反向迭代器:原理与用法

文章目录 一、引言二、反向迭代器的原理与实现细节三、模拟实现C反向迭代器反向迭代器模板类的设计反向迭代器的使用示例与测试 一、引言 迭代器与反向迭代器的概念引入 迭代器&#xff08;Iterator&#xff09;是C标准模板库&#xff08;STL&#xff09;中的一个核心概念&am…

3.15作业

1、思维导图 2、模拟面试题 1&#xff09;什么是IP地址&#xff1f; 答&#xff1a;ip地址是主机在网络中的唯一标识&#xff0c;分为IPv4和IPv6&#xff0c;IP网络号主机号 2&#xff09;IP地址和MAC地址的区别 答&#xff1a;IP地址是由数字和点分十进制表示的主机在网络中…

VS2022 配置QT5.9.9

QT安装 下载地址:https://download.qt.io/archive/qt/ 下载安装后进行配置 无法运行 rc.exe 下载VS2022 官网下载 配置 1.扩展-管理扩展-下载Qt Visual Studio Tools 安装 2.安装完成后,打开vs2022,点击扩展,会发现多出了QT VS Tools,点击它,选择Qt Versions并进行配置…

Java开发从入门到精通(七):Java的面向对象编程OOP:语法、原理、this、构造器

Java大数据开发和安全开发 &#xff08;一&#xff09;Java的面向对象编程1.1 什么是面向对象1.2 面向对象和面向过程的区别1.3 面向对象开发设计特征1.4 面向对象语法1.4.1 先创建对象模板1.4.2 实例化对象1.4.3 对象又该怎么理解?1.4.4 对象在计算机中的执行原理 1.5 类和对…

python:消息推送 - 飞书机器人推送 - 富文本格式

简介&#xff1a;机器人 ( bot ) 是一种自动化的程序&#xff0c;可以用拟人化的身份自动推送消息&#xff0c;或在聊天里与你进行简单的交互。在自动化完成测试任务后&#xff0c;推送测试报告等是一种很常用的收尾工具。 历史攻略&#xff1a; python&#xff1a;消息推送 …

搭建知识管理系统并不复杂,这篇教程来帮你

许多人都有这样的体验&#xff1a;我们抓住的想法和知识总在不经意间溜走&#xff0c;我们想要的信息总是一时无法找到。因此&#xff0c;搭建一个能够系统化、分类和索引存储这些知识的“知识管理系统”是必要的。听上去很专业&#xff0c;其实并不复杂&#xff0c;让我们一步…

单目测距+姿态识别+yolov8界面+车辆行人跟踪计数

yolov5单目测距速度测量目标跟踪&#xff08;算法介绍和代码&#xff09; 1.单目测距实现方法 在目标检测的基础上&#xff0c;我们可以通过计算物体在图像中的像素大小来估计其距离。具体方法是&#xff0c;首先确定某个物体的实际尺寸&#xff0c;然后根据该物体在图像中的像…

可视化展示与交互编辑:探索3D Web轻量化平台HOOPS WEB Platform在BIM中的新可能性

随着数字技术的飞速发展&#xff0c;建筑行业也在不断迈向数字化转型的道路。在这个过程中&#xff0c;BIM&#xff08;Building Information Modeling&#xff0c;建筑信息模型&#xff09;技术已经成为建筑设计、施工和管理领域中的一项重要工具。 而在BIM的应用中&#xff…

TikTok禁令引发数据安全和控制问题

darkreading网站消息&#xff0c;继众议院能源与商务委员会上周通过禁用流行社交媒体平台TikTok的法案后&#xff0c;美国国会于周三投票赞成该法案。该法案规定&#xff0c;任何受“外国”控股的企业需在180天内撤资。 长期以来&#xff0c;TikTok作为字节跳动的子公司&#x…

C#判断素数的方法:试除法 vs 优化的试除法 vs 米勒-拉宾素数检测算法

目录 1.素数也就质数 2. 试除法 3.优化的试除法_1 4.优化的试除法_2 5.优化的试除法_3 6.米勒-拉宾素数检测算法 1.素数也叫质数 一个质数是一个大于1的自然数&#xff0c;只有两个正因数&#xff1a;1和它自身。这意味着如果一个数只有两个正因数&#xff0c;那么它就是…