CSP-202109-2-非零段划分

CSP-202109-2-非零段划分

【70分思路-暴力枚举】

这段代码的目的是在给定一个由自然数(非负整数)组成的数组后,通过选择一个适当的正整数 p,将数组中所有小于 p 的数变为 0,从而使得数组中非零段的数量达到最大。这里的非零段是指连续的、非零的数组元素序列。

程序的主要逻辑分为以下几个步骤:

  1. 读取数组长度 n 和数组元素,同时找出数组中的最大元素 maxElem。

  2. 对于每一个可能的 p 值(从 1 到 maxElem),复制原始数组并将所有小于 p 的元素设置为 0。

  3. 对于每个 p 值的新数组,遍历数组来计算非零段的数量。一个非零段开始于一个非零元素,该元素要么是数组的第一个元素,要么其前一个元素为零。非零段结束于数组的最后一个元素或一个非零元素后跟着一个零元素。

  4. 更新并记录非零段数量的最大值。

  5. 输出非零段的最大数量。

时间复杂度

  1. 第一层循环(读取数组)的时间复杂度为 O(n),n 是数组的长度。

  2. 第二层循环是对于每一个可能的 p 值进行迭代,其最坏情况下的时间复杂度为 O(maxElem)。

  3. 在每一个 p 的值下,我们又对数组进行了两次遍历(一次是将小于 p 的值置为 0,另一次是计算非零段的数量),每次遍历的时间复杂度为 O(n)。

因此,整个程序的总时间复杂度为 O(maxElem * n),这里 maxElem 是数组中的最大值,n 是数组的长度。由于 maxElem 可能接近 n,所以在最坏情况下,时间复杂度可以近似为 O(n^2)。

#include <iostream>    
#include <vector>
#include <algorithm>
using namespace std;
vector<int>arr;int main() {long long n;int maxNum = -1, maxElem = -1;cin >> n;for (int i = 0; i < n; i++){int t;cin >> t;arr.push_back(t);maxElem = max(maxElem, t);}for (int p = 1; p <= maxElem; p++){// 小于 p 的数都变为 0for (auto& it : arr) {if (it < p) it = 0;}int num = 0;bool flag = 1; // 1-上一位是0;0-上一位不是零// 统计非零段for (auto& it : arr) {if (it != 0) {if (flag) {num++;}flag = 0;}else{flag = 1;}}// 记录最大非零段数maxNum = max(maxNum, num);}cout << maxNum;return 0;
}

【100分思路-差分数组】

  1. 初始化和输入处理:定义了两个向量numbersdiff,分别用于存储输入的数列和差分数组。numbers的大小比实际数列长度多2,这是为了在数列的开始和结束添加边界值0,以方便处理。

  2. 去重和边界处理:使用unique函数去除连续重复元素,这对于减少不必要的计算特别有效,因为连续的相同数值不会增加非零段的数量

  3. 差分数组的构建:

    • 差分数组diff用于记录每个可能的数值对应的变化(峰值增加,谷值减少)。这实际上是对数列进行一种“转化”,使得后续的求解更加直接和高效。
    • 遍历数列,如果当前数字是一个峰值(即比前一个和后一个数都大),则在差分数组对应位置加一;如果是谷值(即比前一个和后一个数都小),则减一。
  4. 通过差分数组求解答案:

    • 通过遍历差分数组的累加和(即从后向前计算前缀和),可以找出使非零段数量最大化的数值。这是因为差分数组的前缀和反映了在当前阈值下,非零段的增减情况。

时间复杂度

  • 初始化和输入处理:O(N),其中N是数列的长度。
  • 去除连续重复元素:最坏情况下O(N),因为需要检查每个元素是否与前一个相同。
  • 构建差分数组:O(N),每个元素至多被访问一次。
  • 通过差分数组求解答案:O(V),其中V是数值的最大可能值,这里是MAX_VALUE
  • 因此,总体时间复杂度为O(N + V),其中N是数列的长度,V是数值的最大可能范围。
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring> 
using namespace std;const int MAX_NUM = 500000; // 最大数字数量
const int MAX_VALUE = 10000; // 最大值
vector<int> numbers(MAX_NUM + 2); // 使用vector存储输入的数列
vector<int> diff(MAX_VALUE + 1); // 使用vector存储差分数组int main() {int length;cin >> length;for (int i = 1; i <= length; i++) {cin >> numbers[i];}numbers[0] = numbers[length + 1] = 0; // 将边界设置为0// unique函数去除连续重复元素,更新vector的有效长度length = unique(numbers.begin(), numbers.begin() + length + 2) - numbers.begin() - 1;// 初始化差分数组为0fill(diff.begin(), diff.end(), 0);for (int i = 1; i < length; i++){if (numbers[i - 1] < numbers[i] && numbers[i] > numbers[i + 1]) {diff[numbers[i]]++; // 如果是峰值,对应的差分数组加一}else if (numbers[i - 1] > numbers[i] && numbers[i] < numbers[i + 1]) {diff[numbers[i]]--; // 如果是谷值,对应的差分数组减一}}// 通过差分数组求解答案int maxSegments = 0, sum = 0; // maxSegments记录最终答案,sum记录差分的前缀和for (int i = MAX_VALUE; i >= 1; i--) {sum += diff[i]; // 累加差分得到前缀和maxSegments = max(maxSegments, sum); // 更新答案}cout << maxSegments << endl; return 0;
}

请添加图片描述

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

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

相关文章

使用 gma 绘制隋唐洛阳城

背景 最近河南文旅大伙&#xff0c;给家乡带了一波热度&#xff0c;想想又是王子又是公主&#xff0c;着实羡慕。出门在外&#xff0c;还是对加很有感觉得&#xff0c;不过很遗憾&#xff0c;本人不能为家乡做出贡献&#xff0c;只能使用这种小伎俩&#xff0c;稍稍展示&#…

【网络编程】理解客户端和服务器并使用Java提供的api实现回显服务器

目录 一、网络编程 二、客户端和服务器 三、客户端和服务器的交互模式 四、TCP 和 UDP UDP socket api 的使用 1、DatagramSoket 2、DatagramPacket TCP socket api 的使用 1、ServerSocket 2、Socket 一、网络编程 本质上就是学习传输层给应用层提供的 api&#x…

ARM简介

ARM&#xff1a;ARM是Advanced RISC Machine的缩写&#xff0c;意为高级精简指令集计算机。 英国ARM公司&#xff0c;2016年被软银创始人孙正义斥资320亿美元收购了。现在是软银旗下的芯片设计公司&#xff0c;总部位于英国剑桥&#xff0c;专注于设计芯片&#xff0c;卖芯片生…

揭秘:头部房企如何借助数据分析实现稳健发展?

房地产行业是我国国民经济中的重要支柱产业之一&#xff0c;在房地产市场供求关系发生重大变化的当下&#xff0c;房企面临多重挑战。Kyligence 服务的这家头部房企把发展的重点聚焦于内生&#xff0c;关注内生的转化率、接管的效率以及内生毛利率的提升&#xff0c;引入 Kylig…

基于springboot实现保险信息网站系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现保险信息网站系统演示 摘要 随着互联网的不断发展&#xff0c;现在人们获取最新资讯的主要途径来源于网上新闻&#xff0c;当下的网上信息宣传门户网站的发展十分的迅速。而保险产品&#xff0c;作为当下人们非常关注的一款能够给人们带来医疗、生活、养老或…

面试笔记系列七之多线程+分布式系统基础知识点整理及常见面试题

目录 多线程 介绍一下线程的生命周期及状态&#xff1f; 线程的sleep、wait、join、yield如何使用&#xff1f; sleep与yield方法的区别在于&#xff0c; 进程调度算法 创建线程有哪些方式&#xff1f; 什么是守护线程&#xff1f; ThreadLocal的原理是什么&#xff0c;…

当大语言模型遇到AI绘画-google gemma与stable diffusion webui融合方法-矿卡40hx的AI一体机

你有想过建一台主机&#xff0c;又能AI聊天又能AI绘画&#xff0c;还可以直接把聊天内容直接画出来的机器吗&#xff1f; 当Google最新的大语言模型Gemma碰到stable diffusion webui会怎么样&#xff1f; 首先我们安装stable diffusion webui(automatic1111开源项目&#xff…

微信小程序构建npm失败解决方式

安装完所需要的依赖后&#xff0c;在微信开发者工具菜单栏中选择&#xff1a;“工具” -> “构建 npm”&#xff0c;但是失败。 解决方法&#xff1a;修改 project.config.json 开发者工具创建的项目&#xff0c;miniprogramRoot 默认为 miniprogram&#xff0c;package.js…

数据迁移DTS | 云上MySQL 数据库迁移至达梦数据库

引入 云上 MySQL 数据库 —> 向达梦国产化数据库迁移 下载&安装 达梦客户端工具 DM->可参考之前国产化专栏达梦文章 创建模式 在客户端分别依次执行以下命令脚本&#xff08;这里没有通过客户端管理工具去创建达梦数据库的模式&#xff0c;当然也可以通过图形化界…

WordPress通过宝塔面板的入门安装教程【保姆级】

WordPress安装教程【保姆级】【宝塔面板】 前言一&#xff1a;安装环境二&#xff1a;提前准备三&#xff1a;域名解析四&#xff1a;开始安装五&#xff1a;安装成功 前言 此教程适合新手&#xff0c;即使不懂代码&#xff0c;也可轻松安装wordpress 一&#xff1a;安装环…

视频在线转换,四种方法任你选!(建议收藏)

在当今的数字时代&#xff0c;视频已经成为人们日常生活中不可或缺的一部分。我们通过视频分享知识、表达创造力、观看娱乐节目&#xff0c;甚至参与远程学习和工作。然而&#xff0c;随着视频格式的多样化和设备的激增&#xff0c;我们经常会遇到一个常见的问题&#xff1a;视…

Linux(CentOS)学习

一、认识Linux 1、如何修改Linux时区 2、配置固定IP 3、重启网络服务 3、小技巧快捷键 4、环境变量设置 5、Linux文件的上传和下载 6、压缩和解压 二、基础命令 1、目录命令 (1、)查看目录内容&#xff08;ls&#xff09; 1、ls //查看当前目录内容 2、- a //显示隐藏内容 3…

【算法】二叉搜索树的插入、删除、转换操作

1 二叉搜索树的插入操作 给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和要插入树中的值 value &#xff0c;将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 &#xff0c;新值和原始二叉搜索树中的任意节点值都不同。 注意&#xff0c;可能…

小程序原生 API

微信原生 API 1. API 基础 小程序开发框架提供丰富的微信原生 API&#xff0c;可以方便的调起微信提供的能力&#xff0c;如获取用户信息&#xff0c;本地存储&#xff0c;支付功能等&#xff0c;几乎所有小程序的 API 都挂载在 wx 对象底下&#xff0c;例如&#xff1a;wx.c…

#LLM入门|Prompt#2.2_ AI 应用开发的范式_Language_Models,the_Chat_Format_and_Tokens

在本章中&#xff0c;我们将和您分享大型语言模型&#xff08;LLM&#xff09;的工作原理、训练方式以及分词器&#xff08;tokenizer&#xff09;等细节对 LLM 输出的影响。 我们还将介绍 LLM 的提问范式&#xff08;chat format&#xff09;&#xff0c;这是一种指定系统消息…

STM32合并烧录IAP+APP

STM32合并烧录IAPAPP 通过查找相关资料 有以下几种合并方法 第一种直接将二进制文件用记事本合并 而要合并的就是就将IAP最后的一行删除&#xff0c;然后将APP程序追加在后面。 &#xff08;修改前&#xff09; 把APP的.hex 全部内容拷贝复制到 刚才删掉结束语句的 IAP的.…

Win32汇编ListView控件学习

此控件比较复杂&#xff1b;和基础win32控件不同&#xff1b;需要先初始化Windows公共控件库&#xff0c; invoke InitCommonControls 之后才可使用&#xff1b; lvdemo.asm&#xff0c; .386.model flat, stdcalloption casemap :none ; case sensitiveinclude window…

【OCR识别】使用OCR技术还原加密字体文字

文章目录 1. 写在前面2. 页面分析3. 字符知识4. 加密分析 【作者主页】&#xff1a;吴秋霖 【作者介绍】&#xff1a;Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作&#xff01; 【作者推荐】&#xff1a;对JS逆向感兴趣的朋…

减少页面加载时间:提升用户体验的关键

✨✨ 祝屏幕前的您天天开心&#xff0c;每天都有好运相伴。我们一起加油&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目录 引言 一、为什么页面加载时间重要&#xff1f; 二、如何减少页面加载时间&#xff1f; …

华润置地品牌虚拟代言人IP“吉吉”,开启地产数字化营销新场景

在数字化营销时代&#xff0c;房地产品牌通过虚拟人技术&#xff0c;可以有效链接购房者&#xff0c;占领客户心智&#xff0c;优化购房体验&#xff0c;塑造年轻化、数字化的品牌形象。 华润置地积极拥抱数字变革&#xff0c;通过广州虚拟动力「现场虚拟主持技术服务」与「虚…