首页 > 其他分享 >luogo P1182 数据分段

luogo P1182 数据分段

时间:2024-11-13 17:29:25浏览次数:1  
标签:分段 int Max 最大值 luogo sum 区间 P1182

数列分段 Section II

题目描述

对于给定的一个长度为 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,含义如题目所述。

输出格式

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

样例输入

5 3
4 2 4 5 1

样例输出

6

提示

1 <= N <= 1e5, M <= N, Ai <= 1e8

思路

找到区间最大和的范围(n-1个区间,1个区间),再判断符合区间最大和的条件下能分成多少个区间(用count表示),最后不断进行调整直到符合条件

代码实现

#include <iostream>

const int N = 1e5 + 10;
int a[N], sum, Max = 0, n, m;
using namespace std;

bool judge(int Sum);
int main()
{
    cin >> n >> m;
    for(int i = 0; i < n; i++)
    {
        cin >> a[i];
        sum += a[i];
        Max = a[i] > Max ? a[i] : Max;
    }
    //最大区间和的范围 Max ~ sum
    //Max -> 有n - 1段区间
    //sum -> 有1段区间
    int l = Max, r = sum;
    while(l < r)
    {
        int mid = l + r >> 1;
        if(judge(mid)) r = mid;
        else l = mid + 1;
    }
    cout << l;
}
bool judge(int Sum)  //Sum定义为区间和的最大值
{
    int count = 0, ans = 0;
    for(int i = 0; i < n; i++)
    {
        if(ans + a[i] <= Sum) ans += a[i];
        else
        {
            count++;
            ans = a[i];  //上段区间已经满了,进入一段新的区间
        }
    }
    //count > m  ->  区间过多,区间和小了,要在右边寻找Sum
    //count < m  ->  区间过少,区间和大了,要在左边寻找Sum
    return count < m;
}

标签:分段,int,Max,最大值,luogo,sum,区间,P1182
From: https://www.cnblogs.com/PeachyGalaxy/p/18544435/1113p

相关文章

  • 数列分段(二分)
    [数列分段SectionII]题目描述对于给定的一个长度为\(N\)的正整数数列\(A_{1\simN}\),现要将其分成\(M\)(\(M\leqN\))段,并要求每段连续,且每段和的最大值最小。关于最大值最小:例如一数列\(4\2\4\5\1\)要分成\(3\)段。将其如下分段:\[[4\2][4\5][1]\]第一段和为......
  • 使用 PowerShell 创建多个 .reg 文件进行分段(切片)并且能够在执行时按顺序合并并执行,我
    使用PowerShell创建多个.reg文件进行分段(切片)并且能够在执行时按顺序合并并执行,我们可以按照以下步骤进行:目标:将一个大的 .reg 文件分割成多个小文件。每个小文件(分段)都将是一个有效的 .reg 文件,可以独立执行。使用PowerShell自动生成这些分段 .reg 文件,并执行它......
  • 数值分析作业(第五章):代码+手写计算:插值算法 - Lagrange插值、Newton插值、Hermite插值
    《数值计算方法》丁丽娟-数值实验作业-第五章(MATLAB)作业P171:1,3,6,7,8,15,16数值实验P175:1代码+手写计算:插值算法-Lagrange插值、Newton插值、Hermite插值、分段插值推荐网课:数值分析-东南大学-bilibili数值实验作业(第五章)代码仓库:https://github.com/sylvandi......
  • 2287: 【例28.3】 数列分段
    include<bits/stdc++.h>usingnamespacestd;intn,m,sum,num;intmain(){cin>>n>>m;for(inti=1;i<=n;i++){inte;cin>>e;if(num+e>m){sum++;num=e;}else{num+=e;}}cout<<sum+1;return0;}反思:这段代......
  • 时间序列分段和预测
     总览DataoverviewLoadinglibraryanddataSegmentationPre-processingdataforsegmentationDeterminingthenumberofclusterClusteringVisualizationofsegmentsAnalyzingeachsegmentForecastingSingletime-seriesPrepocessi......
  • 分段函数+函数性质的新定义问题
    专题:分段函数+函数性质\(\qquad\qquad\)题型:新定义问题\(\qquad\qquad\)难度系数:★★★ 【题目】所谓图形\(D\)完全覆盖曲线\(G\)是指\(G\)中的每一个点都落在\(D\)的内部或边界,现用一个有两个顶点在\(x\)轴上的矩形区域完全覆盖函数\(f(x)=\left\{\begin{ar......
  • 分段处理海量数据SQL
    在DB2中,你可以使用`ROW_NUMBER()`窗口函数来为表中的每一行分配一个唯一的序号。然后,基于这个序号,你可以将数据划分成指定数量的组,并确定每组的上边界和下边界。假设你的表名为`my_table`并且它有一个唯一索引列叫做`id`。你想把1000条记录分成10组,那么每组应该包含100条记......
  • golang实现分段协程数据查询、任务处理
    使用背景我们经常遇到需要同时执行耗时的IO请求或数据处理等场景,需要用到协程来达到高效率,但又需要控制协程执行过程的量,防止资源过载,让效率和资源达到最优状态,这就是分段执行的价值。一般实现的方式主要有两种:1、需要获取执行结果,在协程内将执行结果写入chan,并在分段创......
  • C程序设计:计算分段函数
    有一个函数:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪......
  • 操作系统:保护模式(一)GDT 与分段机制
    GDT与分段机制CPU开机时运行于实模式,寻址方式是段寄存器\(\times\)10+偏移寄存器=物理地址,主要原因是因为8086地址线和数据线不匹配导致的。但是这种寻址方式既不安全也不支持现代操作系统所需的、多任务支持、cpu特权模式等。在实模式下,对于基址,变址寻址的寄存器有明确要......