【CSP试题回顾】202109-2-非零段划分

news2024/10/7 2:27:23

CSP-202109-2-非零段划分

关键点:差分数组

详见:【CSP考点回顾】差分数组

时间复杂度分析

使用差分数组的优势在于,它将问题转化为了在一次遍历中识别并利用关键变化点(波峰和波谷),从而避免了对每个可能子数组的重复检查。这种方法利用了问题的特殊结构——即只有在特定的转折点才需要更新我们的计数——来大幅度减少必要的计算量。因此,在处理大数据量时,差分数组方法的效率远高于暴力枚举法。

  1. 暴力枚举法(70分)

    • 在暴力枚举方法中,尝试每个可能的子数组,然后检查每个子数组是否符合条件(是否是非零段)。对于每个长度为 n 的数组,有 n ( n + 1 ) / 2 n(n+1)/2 n(n+1)/2 种可能的子数组(因为我们可以从数组的每个位置开始,选择不同的结束位置)。
    • 对于每个子数组,我们需要 O ( m ) O(m) O(m) 的时间来验证它是否是一个非零段,其中 m 是子数组的长度。因此,总的时间复杂度将会是 O ( n 3 ) O(n^3) O(n3)(因为对于每个子数组我们都进行了线性时间的检查)。
  2. 差分数组法(100分)

    • 使用差分数组的方法,我们首先通过一次遍历( O ( n ) O(n) O(n) 时间复杂度)处理原数组来建立差分数组,并进行初始化处理(例如,标记波峰和波谷)。
    • 接下来,我们再次遍历差分数组(又是 O ( n ) O(n) O(n) 时间复杂度)来计算最长的非零段。在这次遍历中,我们累积差分值,并记录最大的累积值。
    • 因此,整个过程的时间复杂度是 O ( n ) + O ( n ) = O ( n ) O(n) + O(n) = O(n) O(n)+O(n)=O(n),远低于暴力枚举方法的 O ( n 3 ) O(n^3) O(n3)

解题思路

  1. 使用向量 A,在其开始和结束位置添加额外的零元素,以符合问题中提到的非零段定义。
  2. 使用 unique 函数对数组 A 进行去重,即连续重复的元素只保留一个,因为连续的相同值不会影响非零段的长度
  3. 通过遍历数组 A,计算差分数组 diff在波峰位置加一,在波谷位置减一。这里波峰指的是 A[i] 比它前后的元素都要大的情况,波谷指的是 A[i] 比它前后的元素都要小的情况(详见下图)。

请添加图片描述

在这个问题中,使用“波峰”和“波谷”的概念来加一或减一,实际上是利用差分数组的特性来标记数组中的重要转变点。我们利用差分数组来记录特定模式的出现——即数组中的极值点。

  1. 为什么在波峰位置加一
    • 波峰定义为一个元素,其值大于其前后的元素(A[i-1] < A[i] > A[i+1])。在这个位置加一是为了标记一个上升段的结束和下降段的开始。这是非零段可能的开始或结束,因为在实际应用中,一个上升然后下降的序列(波峰)意味着我们找到了一个完整的子段,这可能是我们寻找的非零段的一部分
  2. 为什么在波谷位置减一
    • 波谷定义为一个元素,其值小于其前后的元素(A[i-1] > A[i] < A[i+1])。在这个位置减一是为了标记一个下降段的结束和上升段的开始。这也是非零段可能的开始或结束,因为它标志着一个低谷,即从高值下降到低值的转变点。

请添加图片描述

  1. 遍历差分数组 diff,累加当前值到 sum,并更新 noneZeroMax,用来记录遇到的最大的非零段长度。sum 的计算方式保证了我们只在非零段内进行计数,并且每次遇到非零段时都检查是否能更新最大长度。

完整代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int n, sum, noneZeroMax;
vector<int>diff(50000); // 差分数组

int main() {
    cin >> n;
    vector<int>A(n + 2, 0); // A的第一个和最后一个元素置零(非零段定义)
    for (int i = 1; i <= n; i++)
    {
        cin >> A[i];
    }
    auto last = unique(A.begin(), A.end()); // 去重
    A.erase(last, A.end());

    // 计算差分数组:波峰+1,波谷-1
    for (int i = 1; i <= A.size() - 2; i++)
    {
        if (A[i - 1] < A[i] && A[i] > A[i + 1]) diff[A[i]]++;
        if (A[i - 1] > A[i] && A[i] < A[i + 1]) diff[A[i]]--;
    }

    // 统计最大非零段
    for (int i = diff.size()-1; i >= 0; i--)
    {
        sum += diff[i];
        noneZeroMax = max(sum, noneZeroMax);
    }
    cout << noneZeroMax;
    return 0;
}

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【重要公告】BSV区块链协会开始对Teranode节点软件进行技术测试

​​发表时间&#xff1a;2024年2月22日 Teranode节点软件将使BSV区块链网络的交易处理速度提升至每秒110万笔&#xff0c;从而拓宽企业和政府客户的区块链应用范围。 2024年2月22日&#xff0c;瑞士楚格 - BSV区块链协会宣布已经开始对Teranode节点软件进行技术测试&#xff…

软考高级:系统工程生命周期阶段概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

Vue:自动按需导入element-plus图标

自动导入使用 unplugin-icons 和 unplugin-auto-import 从 iconify 中自动导入任何图标集。 完整vite.config.js参考模板 https://download.csdn.net/download/ruancexiaoming/88928539 导入element-plus图标 命令行安装unplugin-icons pnpm i -D unplugin-icons//没有安装自…

Vue中用户权限如何处理?

Vue中用户权限如何处理&#xff1f; 在 Vue 中&#xff0c;可以采用多种方式来处理用户权限&#xff0c;以下是一些常见的方法&#xff1a; 1. 使用路由守卫 Vue Router 提供了 beforeEach 导航守卫&#xff0c;可以在路由跳转之前进行权限检查。例如&#xff1a; router.be…

【vue.js】文档解读【day 3】 | 条件渲染

如果阅读有疑问的话&#xff0c;欢迎评论或私信&#xff01;&#xff01; 文章目录 条件渲染前言&#xff1a;v-ifv-elsev-else-iftemplate中的v-ifv-showv-if vs v-show 条件渲染 前言&#xff1a; 在JavaScript中&#xff0c;我们知道条件控制语句可以控制程序的走向&#…

手写分布式配置中心(六)整合springboot(自动刷新)

对于springboot配置自动刷新&#xff0c;原理也很简单&#xff0c;就是在启动过程中用一个BeanPostProcessor去收集需要自动刷新的字段&#xff0c;然后在springboot启动后开启轮询任务即可。 不过需要对之前的代码再次做修改&#xff0c;因为springboot的配置注入value("…

746. 使用最小花费爬楼梯 (Swift版本)

题目 给你一个整数数组 cost&#xff0c;其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用&#xff0c;即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 请你计算并返回达到楼梯顶部的最低花费。 限制条件 2…

6. 虚拟机及Linux安装

虚拟机及Linux安装 进行嵌入式项目开发&#xff0c;第一步就是要建立嵌入式开发环境&#xff0c;主要包括安装 Bootloader 工具、不同平台的交叉编译器&#xff08;如ARM 平台的arm-linux-gcc&#xff09;、内核源码树&#xff08;在需要编译和配置内核时&#xff09;、在调试…

Python-sklearn.datasets-make_blobs

​​​​​​sklearn.datasets.make_blobs()函数形参详解 """ Title: datasets for regression Time: 2024/3/5 Author: Michael Jie """from sklearn import datasets import matplotlib.pyplot as plt# 产生服从正态分布的聚类数据 x, y, cen…

Ps:渐变工具 - 经典渐变

渐变工具 Gradient Tool常用于背景填充和界面元素设计&#xff0c;可创建平滑的颜色过渡效果。也可用于图层蒙版上&#xff0c;控制图像或效果的平滑混合。 快捷键&#xff1a;G 渐变工具选项栏中有两种模式&#xff1a;渐变 Gradient和经典渐变 Classic gradient&#xff0c;经…

CSS中em/px/rem/vh/vw区别详解

文章目录 一、介绍二、单位pxemremvh、vw 三、总结 一、介绍 传统的项目开发中&#xff0c;我们只会用到px、%、em这几个单位&#xff0c;它可以适用于大部分的项目开发&#xff0c;且拥有比较良好的兼容性 从CSS3开始&#xff0c;浏览器对计量单位的支持又提升到了另外一个境…

信息系统项目管理师--进度管理

项⽬进度管理是为了保证项⽬按时完成&#xff0c;对项⽬所需的各个过程进⾏管理&#xff0c;包括规划进度、 定义活动、排列活动顺序、估算活动持续时间、制订项⽬进度计划和控制进度。⼩型项⽬中&#xff0c; 定义活动、排列活动顺序、估算活动持续时间及制定进度模型形成进度…

【办公类-21-09】三级育婴师 视频转音频Python

背景需求&#xff1a; 用AI对话工具试试能否Python将MP4视频转成音频&#xff0c;再转成文字docx&#xff08;不用格式工厂转&#xff09; 结果&#xff1a; 视频MP4转音频wav 视频MP4转音频wav 作者&#xff1a;AI对话大师&#xff0c; 时间&#xff1a;2024年3月8日 impo…

利用GPT开发应用004:从GPT-1到GPT-3

文章目录 一、GPT-1二、GPT-2三、GPT-3四、从GPT-3到InstructGPT 一、GPT-1 2018年年中&#xff0c;就在变换器架构问世一年后&#xff0c;OpenAI发表了一篇题为“通过生成式预训练改进语言理解”的论文&#xff0c;作者是Radford, Alec等人。在这篇论文中&#xff0c;该公司介…

ODI报错

三月 08, 2024 1:20:09 下午 oracle.odi.mapping 信息: Start generation of map physical design: MapPhysicalDesign New_Mapping.物理 三月 08, 2024 1:20:09 下午 oracle.odi.mapping 信息: Finished generation of map physical design: MapPhysicalDesign New_Mapping.物…

BUUCTF-Misc4

镜子里面的世界1 1.打开附件 解压&#xff0c;是一张图片 2. zsteg工具 用zsteg分析图片 3.得到flag ningen1 1.打开附件 是一张图片 2.binwalk 用binwalk -e 分离文件 3.ARCHPR工具 打开分离后的文件夹&#xff0c;有一个加密的压缩包&#xff0c;用ARCHPR解密 4.解密 将…

sheng的学习笔记-AI-多分类学习:ECOC,softmax

目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 基本术语&#xff1a; 若我们欲预测的是离散值&#xff0c;例如“好瓜”“坏瓜”&#xff0c;此类学习任务称为“分类”(classification)&#xff1b; 若欲预测的是连续值&#xff0c;例如西瓜成熟度0.95、0.37&#xff0c;…

HNU-计算机网络-甘晴void学习感悟

前言 计算机网络其实我没太学懂&#xff0c; 仅从应试来说&#xff0c;考试成绩也不太好。 这也是为什么一直没有更新这一学科的学习感悟。 大三下还是有点闲&#xff0c;一周三天小长假&#xff0c;闲来无事还是给写了。 教材使用这本&#xff1a; 总领 期中考试 30% 期…

排序——希尔排序、插入排序

本节复习排序中的希尔排序&#xff0c;希尔排序属于插入排序。 希尔排序的代码和插入排序非常类似。 思想却相对于插入排序来说复杂。 在复习希尔排序之前&#xff0c; 我们需要先复习一下插入排序。 目录 插入排序 插入过程 代码实现 希尔排序 希尔排序的思想 代码实…

#onenet网络请求http(GET,POST)

参考博文&#xff1a; POST: https://blog.csdn.net/qq_43350239/article/details/104361153 POST请求&#xff08;用串口助手测试&#xff09;&#xff1a; POST /devices/1105985351/datapoints HTTP/1.1 api-key:AdbrV5kCRsKsRCfjboYOCVcF9FY Host:api.heclouds.com Con…