题意:给定一列数,分成m段,使每段和的最大值最小。

  考虑二分最小段和size,答案显然满足单调性。可以在每次check中累加数列元素判断当前组的总和是否在size以内。由于序列元素均为非负整数,前缀和数组的值满足非严格单调递增,那么可以在前缀和上再套一个二分来优化暴力累加的过程。

  我不知道优化以后的复杂度怎么分析,反正它跑的快多了

代码:

  1. #include <iostream>
  2. #include <cstdio>
  3. #define maxn 100010
  4. using namespace std;
  5. int a[maxn], n, m;
  6. long long s[maxn];
  7. bool div(int sum) {
  8. int cnt = 0;
  9. for (int i = 1; i <= n; ) {
  10. if (a[i] > sum) return false;
  11. int l = i, r = n;
  12. while (l < r) {
  13. int mid = (l + r + 1) >> 1;
  14. s[mid] - s[i - 1] <= sum ? l = mid : r = mid - 1;
  15. }
  16. ++cnt, i = l + 1;
  17. }
  18. return cnt <= m;
  19. }
  20. int main() {
  21. //  freopen("testdata-10.in", "r", stdin);
  22. ios::sync_with_stdio(0);
  23. cin >> n >> m;
  24. int l = 0, r = 0;
  25. for (int i = 1; i <= n; ++i)
  26. cin >> a[i], s[i] = a[i] + s[i - 1], l = max(l, a[i]);
  27. r = s[n];
  28. while (l < r) {
  29. long long mid = (l + r) >> 1;
  30. if (div(mid))
  31. r = mid;
  32. else l = mid + 1;
  33. }
  34. cout << l;
  35. return 0;
  36. }

【模板】【P1182】数列分段II——二分答案的更多相关文章

  1. 洛谷P1182 数列分段【二分】【贪心】

    题目:https://www.luogu.org/problemnew/show/P1182 题意: 有n个数,要分成连续的m段.将每段中的数相加,问之和的最大值的最小值是多少. 思路: 和P1316 ...

  2. P1182 数列分段Section II

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

  3. 洛谷 P1182 数列分段 Section II

    洛谷 P1182 数列分段 Section II 洛谷传送门 题目描述 对于给定的一个长度为N的正整数数列A-iA−i,现要将其分成M(M≤N)M(M≤N)段,并要求每段连续,且每段和的最大值最小. ...

  4. 1436:数列分段II

    1436:数列分段II 题解 二分答案 我们最终答案的取值区间是[  max(a[i])  ,   ∑a[i]  ] 设定 l=max(a[i]) , r=∑a[i]  , mid不断二分 mid表示 ...

  5. P1182 数列分段`Section II` P1316 丢瓶盖 二分答案

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

  6. P1182 数列分段`Section II`(贪心+二分, 好题)

    这道题让我见识了二分的新姿势.本来,我是二分的位置的. 思路:直接二分答案x, 关键是检验函数的写法: 先用前缀和 a[i....], 看满足多少段满足 a[ j ]-a[ i ]<=x; 的注 ...

  7. luogu P1182 数列分段Section II

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

  8. 洛谷P1182数列分段

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

  9. 数列分段II(信息学奥赛一本通 1436)(洛谷 1182)

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

随机推荐

  1. SpringBoot+HikariCP+Dropwizard-Metrics统计连接池使用情况

    SpringBoot+HikariCP+Dropwizard-Metrics统计连接池使用情况 背景,HikariCP是Java目前使用最广的连接池工具类,SpringBoot默认也是用这个,现在想获 ...

  2. 关于查看本机ssh公钥以及生成公钥

    1.查看本机公钥: 打开git bush,执行  cd ~/.ssh  进入.ssh文件夹(C:\Users\Administrator\.ssh) 执行  ls  命令,查看列表 执行 cat id ...

  3. Linux 系统基于 Hadoop 安装 Hive

    [注意]安装hive前提是要先安装hadoop集群,并且hive只需要在hadoop的namenode节点集群里安装即可(在所有的namenode上安装),可以不在datanode节点的机器上安装. ...

  4. Iperius Backup Full--小中企业简单自动备份的实用工具

    从事IT行业几个年头了,一直以来发现备份这个词是十分特殊的.无论是事业国有大企央企还是个人爱好者,小型工作室,中小企业. 对于备份都是明确知道十分重要,但在正在实施起来会因为投入,领导重视程度,实施管 ...

  5. DOM属性/节点属性

    DOM属性:DOM(Document Object Model,文档对象模型)一种独立于语言,用于操作xml,html的应用编程接口1:获取节点: document.getElementById(id ...

  6. LoRa联盟的简介

    LoRa联盟成立于2015年3月,从成立开始,LoRaWAN规范就在不断更新,从1.0.0版本已更新至1.0.2版本,目前能公开下载的事2016年7月完成的1.0.2版本,可以看到该规范的主要作者包括 ...

  7. Learn day5 迭代器\生成器\高阶函数\推导式\内置函数\模块(math.time)

    1.迭代器 # ### 迭代器 """能被next调用,并不断返回下一个值的对象""" """ 特征:迭代器会 ...

  8. 华为云FusionInsight MRS:助力企业构建“一企一湖,一城一湖”

    摘要:华为云FusionInsight MRS新一代的数据湖,让大数据越用越快.越用越易.越用越稳.越用越省!让数据价值近在眼前! 10月30日,以"携手共赢·数创未来"为主题的第 ...

  9. React react-redux props或state更新视图无法重新渲染问题

    记录学习React时自己是如何挖坑把自己埋了的过程:children以及其它props被修改时相关组件无法重新渲染(做了两天) 父组件代码: class UserHome extends Compon ...

  10. 【Kata Daily 190906】Vasya - Clerk(职员)

    题目: The new "Avengers" movie has just been released! There are a lot of people at the cine ...