首页 > 其他分享 >P1182 数列分段 Section II

P1182 数列分段 Section II

时间:2024-06-06 19:12:09浏览次数:22  
标签:二分 分段 int Section mid II leq 最大值 P1182

数列分段 Section II

题目描述

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

关于最大值最小:

例如一数列 $4\ 2\ 4\ 5\ 1$ 要分成 $3$ 段。

将其如下分段:

$$[4\ 2][4\ 5][1]$$

第一段和为 $6$,第 $2$ 段和为 $9$,第 $3$ 段和为 $1$,和最大值为 $9$。

将其如下分段:

$$[4][2\ 4][5\ 1]$$

第一段和为 $4$,第 $2$ 段和为 $6$,第 $3$ 段和为 $6$,和最大值为 $6$。

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

所以可以得到要将数列 $4\ 2\ 4\ 5\ 1$ 要分成 $3$ 段,每段和的最大值最小为 $6$。

输入格式

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

第 $2$ 行包含 $N$ 个空格隔开的非负整数 $A_i$,含义如题目所述。

输出格式

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

样例 #1

样例输入 #1

5 3
4 2 4 5 1

样例输出 #1

6

提示

对于 $20%$ 的数据,$N\leq 10$。

对于 $40%$ 的数据,$N\leq 1000$。

对于 $100%$ 的数据,$1\leq N\leq 10^5$,$M\leq N$,$A_i < 10^8$, 答案不超过 $10^9$。


算法1

(二分答案) $O(n)$

【分析】

为何用二分
从题目中 <每段和的最大值最小>中能看出这题目需要用二分来解决.

求最大值的最小。即向左逼近

1.二分什么:每区间和的最大值
2.二分边界:
选取每种情况的极限值-有两种
(1)一个数作为一个区间时的最大值
(2)整个区间和的最大值

for(int i=1;i<=n;i++){
    l = max(l, a[i]);   //一个数作为一个区间是的最大值 因此需要去整个区间中的最大值
    r += a[i];    //每个数的累加就是整个区间和的最大值
}

3.判断依据:分段数
假设我们当前二分得到的mid值作为每个区间的最大值时
根据分出来的段数和题目要求的段树来进行比较选择二分区域
(1)分出来的段数小于或等于题目要球的分段数

---说明当前的区间和的最大值太大了需要再小点 因此 r=mid;

(2)分出来的段数大于题目要求的分段数

---说明当前区间和的最大值太小了,需要再大点,因此l=mid+1;

4.需要注意的点
cnt = 1; 最小一个区间

C++ 代码

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m;
int a[N];
int l,r,mid;

bool check(int mid){
	int sum=0,cnt=1; //注意!!! cnt初值为 1 
	
	for(int i=1;i<=n;i++){
		
		if(sum + a[i] <= mid) sum += a[i];
		
		else {
			sum = a[i];  //a[i]作为独立的区间
			cnt++;
		}
	}
	if(cnt <= m) return 1; 
	else return 0;
}
int main(){
	cin>>n>>m;
	
	for(int i=1;i<=n;i++) cin>>a[i];
	
	for(int i=1;i<=n;i++){
	
		l=max(l,a[i]);
		
		r+=a[i];
	}
	while(l<r){
		mid=l+r>>1;
		if(check(mid)) r=mid;
		else l=mid+1;
	}
	cout<<l;
	return 0;
} 

标签:二分,分段,int,Section,mid,II,leq,最大值,P1182
From: https://www.cnblogs.com/ltphy-/p/18235873

相关文章

  • Yii2 框架中,通过 yii\db\Command 对象来执行原生 SQL 语句
    在Yii2中,你可以通过yii\db\Command对象来执行原生SQL语句。这包括查询操作(如SELECT)和数据操作(如INSERT、UPDATE、DELETE)。以下是一些常见的例子,展示如何在Yii2中执行SQL语句。执行查询语句执行SELECT查询并获取结果你可以使用queryAll()、queryOne()、queryColu......
  • 访问托管在运行 IIS 的服务器上的网站时出现 HTTP 错误 405.0
    问题:客户端请求部署在IIS中的APS.NETCOREAPI时,get请求正常,但delete和put请求报405错误解决方法:在控制面版本-》程序功能-》启用关闭Windows功能中的,IIs-》常见Http->WebDAV发布(删除),后恢复正常。即当前症状:3本文内容症状原因1原因2原因3显示另外3个本文可帮......
  • 代码随想录算法训练营第29天 | 491.递增子序列 、46.全排列 、47.全排列 II
    491.递增子序列本题和大家刚做过的90.子集II非常像,但又很不一样,很容易掉坑里。https://programmercarl.com/0491.递增子序列.html视频讲解:https://www.bilibili.com/video/BV1EG4y1h78v关键点还要在于本层使用过的数字不能再使用/***@param{number[]}nums*@return......
  • [email protected]: Permission denied (publickey)
    输入ssh-keygen-trsa-C"[email protected]"   [email protected]的邮箱 一直回车,直到看到  然后到这个路径下打开文件  将里面的内容复制到git帐号的ssh中 ......
  • Mac单机游戏推荐:赏金奇兵3 Desperados III 激活版
    《赏金奇兵》是一款动作冒险类游戏,玩家将扮演一名赏金猎人,在游戏中穿梭于各种危险的地方,完成各种任务和挑战。游戏设定在一个充满科幻和幻想元素的世界中,玩家可以通过自由探索、战斗、解谜来完成任务。玩家需要收集各种武器和装备,提升角色的能力和技能,并与各种怪物和敌人进行......
  • IIS 安装和部署
    1.第一步 2.第二步:  第三步,把下面这些全安装上 4,第四步:在控制面板,将查看方式修改为小图标 5.找到"管理工具"有的电脑叫"windos工具"点击进入6.找到刚刚安装的IIS  7.添加网站 8,根据自己情况配置即可 ......
  • ASP.NET MVC之Layout布局与@RenderBody、@RenderPage、@RenderSection
    原文链接:https://www.cnblogs.com/liujie2272/p/6279925.html@RenderBody@RenderBody是布局页(_Layout.cshtml)通过占位符@RenderBody占用独立部分,当创建基于此布局页的试图时,视图的内容会和布局页合并,而新创建的视图内容会通过布局页的@ReanderBody方法呈现在Body之间。此方法不......
  • 关于ucosii操作系统原理------(三)内存管理
    目录一、引言二、内存控制块三、内存管理的实现源码1.动态内存分区创建函数2.获得一个内存块函数3.释放内存块函数一、引言   接下来说一下实时操作系统的动态内存管理。对于实时操作系统来说,动态内存分配的执行时间必须是可确定的。ucosii对malloc()函数和fre......
  • 第三届机器人、人工智能与信息工程国际学术会议(RAIIE 2024)
    【ACM独立出版/Fellow大咖云集】2024年第二届机器人、人工智能与信息工程国际学术会议(RAIIE2024)20243rdInternationalSymposiumonRobotics,ArtificialIntelligenceandInformationEngineering大会官网:https://ais.cn/u/juURra大会时间:2024年07月05-07日大会地点:新......
  • 力扣-1049. 最后一块石头的重量 II
    1.题目题目地址(1049.最后一块石头的重量II-力扣(LeetCode))https://leetcode.cn/problems/last-stone-weight-ii/题目描述有一堆石头,用整数数组 stones表示。其中 stones[i]表示第i块石头的重量。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分......