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.pswp.cn/news/711040.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/711040.shtml
英文地址,請注明出處:http://en.pswp.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…

Leetcode 128. 最長連續序列

最長連續序列 給定一個未排序的整數數組 nums &#xff0c;找出數字連續的最長序列&#xff08;不要求序列元素在原數組中連續&#xff09;的長度。 請你設計并實現時間復雜度為 O(n) 的算法解決此問題。 示例 1&#xff1a; 輸入&#xff1a;nums [100,4,200,1,3,2] 輸出&am…

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;安裝環…

node如何解析前端傳遞過來的命令行字符串

node如何解析前端傳遞過來的命令行字符串 在Node.js中&#xff0c;如果你想處理從前端傳遞過來的命令行字符串&#xff0c;你可以根據你的應用程序的架構來決定如何接收這些字符串&#xff0c;然后進行解析。一般來說&#xff0c;命令行字符串可能會通過HTTP請求&#xff08;如…

視頻在線轉換,四種方法任你選!(建議收藏)

在當今的數字時代&#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…

深入理解Lucene:開源全文搜索引擎的核心技術解析

1. 介紹 Lucene是什么&#xff1f; Lucene是一個開源的全文搜索引擎庫&#xff0c;提供了強大的文本搜索和檢索功能。它由Apache軟件基金會維護和開發&#xff0c;采用Java語言編寫&#xff0c;因其高性能、可擴展性和靈活性而備受歡迎。 Lucene的作用和應用場景 Lucene主要…

Linux下創建用戶并且賦root權限

背景&#xff1a;好幾次都要求自己在服務器上創建用戶&#xff0c;并且賦權限給這個用戶的root權限&#xff0c;因為生產服務器上不讓用root用戶操作&#xff0c;之前沒怎么記錄&#xff0c;因為這個操作不多&#xff0c;但是又記不住這個操作&#xff0c;一到用上&#xff0c;…

【算法】二叉搜索樹的插入、刪除、轉換操作

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的.…