题目选自洛谷P1182

本题解法:二分答案+贪心

思路:首先,分析题目,求最大值的最小化,直接联想到二分,So我们直接二分答案,关键是要怎么去高效的check,我们考虑一个贪心的思路,能加的就加上,不能则新开一段,so对于二分的值x,我们从数列a从前往后扫,如果tot大于了x,我们不加而是tot重新赋值并且num++,最后只需判断num是否不大于m就行了。这样判断与前缀和一样是O(n)的复杂度,但是节省了空间且容易思考。

注意:二分时的区间取值问题,很明显,对于l的赋值应该取数列中的最大值,而r应该取数列的总和。(亲测,如果l赋值为0或1,第4个点会wa)。

如果你不知道什么是二分答案,请先看其他题解,而我想借此题谈谈二分答案的本质,并发散思维,得到一些新的算法。

个人认为,二分答案由“二分”和“答案”组成。宏观上,二分,是对问题状态空间的一种遍历方式,主要作用是降低时间复杂度;答案,即枚举答案,则是一种解题方法,主要作用是化求解为判定,降低难度。

具体来讲:

  • 答案。在此题中,我们首先要确定答案的范围。显然,答案最小可能是数列中的最大值(记为 l ),最大可能是所有数的和(记为 r)。其次,我们发现,给出一个解,判定这个解是否合法,在此题中显得简单。这启示我们用枚举答案再判定的方法解决此题。

  • 二分。二分建立在答案的基础上。此题中答案的排布,是有一定规律的,即,存在一个分界点 p,使得 [l,p)中的数都是非法解,[p,r]中的数都是可行解。而 p 即为所求的最小解。这种性质启示我们用一种特定的方法来枚举答案,于是有了二分。

题目描述

对于给定的一个长度为N的正整数数列 A1∼N​,现要将其分成 M(M≤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 个空格隔开的非负整数 Ai​,含义如题目所述。

输出格式

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

输入输出样例

输入 1

5 3
4 2 4 5 1

输出 1

6

说明/提示

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

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

对于 100% 的数据,1≤N≤10^5,M≤N,Ai < 10^8, 答案不超过 10^9。

解题代码:

#include<stdio.h>
#include<iostream>
#include<math.h>
#include<algorithm>
using namespace std;
int n,m,a[100010];
int ans,l,r,mid;
inline bool check(int x){int tot = 0, num = 1;for(int i=1;i<=n;i++){if(tot+a[i] <=x) tot+=a[i];else tot = a[i],num++;}return num<=m;
}
int main(){cin>>n>>m;for(int i=1;i<=n;i++)cin>>a[i],l=max(l,a[i]), r+=a[i];while(l <= r){mid = (l+r)>>1;if(check(mid)) ans = mid,r = mid - 1;else l = mid + 1;}cout<<ans;return 0;
}

二分答案——数列分段 Section II(洛谷 P1182)相关推荐

  1. 洛谷P1182 数列分段Section II 二分答案

    洛谷P1182 数列分段Section II 二分答案 题意:将 n 个 数 分为 m段 求一种方案,使这m段中最大的和 最小 额..可能有点拗口,其实就是说每一种方案,都有对应的 每段和的最大值, ...

  2. 【Luogu1182】数列分段Section II(二分)

    problem 一个长度为N的正整数数列A[i] 将其分成M段,并要求每段连续 求每段和最大值(M段各自的和中最大的那个)最小(某种方案下最小). solution 二分每段和的最大值mid. 如果存 ...

  3. 二分答案——yyy2015c01 的 U 盘(洛谷 P2370)

    题目选自洛谷P2370 两种解法,01背包+排序,或是直接二分即可 写了二分最后只有40的分...刚好过了给的四个样例 哭辽~想了半天不知道哪里错了 题目背景 在 2020 年的某一天,我们的 yyy ...

  4. 二分答案——烦恼的高考志愿(洛谷 P1678)

    题目选自洛谷P1678 如果仅仅是套循环的话显然在数据比较大的情况下是不够优化 的,所以我们可以先把得到的分数线排序再二分操作. 这道题二分的原理很简单,因为我们求的是某一个学生和某一个分数线最小的差 ...

  5. 洛谷P1182 数列分段 Section II(二分+贪心)

    题目描述 对于给定的一个长度为N的正整数数列 A1∼NA _{1∼N}A1∼N​,现要将其分成 M(M≤N)M(M≤N)M(M≤N)段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一 ...

  6. 洛谷P1182 数列分段`Section II`

    . . . . . 分析 首先,分析题目,求最大值的最小化,直接联想到二分 然而关键是要怎么去高效的check 我们考虑一个贪心的思路,能加的就加上,不能则新开一段,所以对于二分的值x,我们从数列a从 ...

  7. 数列分段`Section II`(洛谷-P1182)

    题目描述 对于给定的一个长度为N的正整数数列 A−i ,现要将其分成 M(M≤N) 段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一数列 4 2 4 5 1 要分成 3 段 将其如 ...

  8. 贪心: Array Splitting(数列分段)(洛谷CF1175D)

    解析 这题可以转化一下: (<神笔马良>....) 计算这些长方形对应下标的总加和 我们可以一层一层往上垒,假设第i层起始点为xi,总和为sumi,再设从1到i的前缀和为si 显然第一层x ...

  9. 【二分】数列分段(ybtoj 二分-1-1)

    数列分段 ybtoj 二分-1-1 题目大意 给出一个序列A,让你把它分成m段,使每段和最大值最小 输入样例 5 3 4 2 4 5 1 输出样例 6 数据范围 1⩽M⩽N⩽1051\leqslant ...

最新文章

  1. c++ svd实例整理
  2. gitlab mysql 表_gitlab-mysql_高可用
  3. linux 空间不够了,怎么办?Disk Requirements:At least 11MB more space needed on the / filesystem....
  4. 职业发展鉴定方法:第一行:自己行 第二行:大家说你行 第三行:领导行 就这么简单,去努力吧,如果你做到了这三个行,那么你肯定行...
  5. python 免费空间_总算找到php免费空间
  6. linux 格式化u盘_【Ventoy】一个U盘,启动多个系统
  7. 2.python数据结构的性能分析
  8. Scala:函数式编程之下划线underscore
  9. 下一代防火墙评测--网界
  10. python中printf的用法_python输出语句print的用法是什么?
  11. 微观经济学 读书笔记
  12. VAX 的使用快捷键
  13. CAD-Cass小结(6)——dat数据格式与展点(显示属性,更改点符号)
  14. linux移除硬盘命令,在Linux中在线添加及移除SCSI硬盘方法
  15. 2022-2028全球与中国工业蜂窝网关市场现状及未来发展趋势
  16. _access()函数
  17. [动态规划]最长公共子序列
  18. 标致氢气汽车已开始生产
  19. DHL供应链将再投资2.18亿欧元加码中国市场
  20. linux越狱时手机怎么进入dfu,苹果进入DFU的几种方法

热门文章

  1. Position定位
  2. java for(o t :object) 获取顺序号_JAVA泛型通配符T,E,K,V区别 瞬间豁然开朗
  3. 内涝预测过程的噪音_第七章噪声解析
  4. cesium js 路径_[CesiumJS]Cesium入门3 – Cesium目录框架结构
  5. 输油管道问题 测试数据_建立测试时要考虑的数据管道
  6. wpf开源ui引用步骤_完善开源产品策略的6个步骤
  7. 在组织中为IT部门构建小型冠军的最快方法
  8. Bootstrap 警告框插件Alert
  9. 数组实例的copyWithin()方法
  10. Python笔记(1) Python简介