202109-2 非零段划分
文章目录
- 代码解释
- C++
- 总结
本题链接:202109-2 非零段划分
本博客给出本题截图:
代码解释
应各位博友的需求,写一下本题思路,本题用到了 前缀和 以及 差分 的思维,且这两个算法是近几次考试中的第二题突破口,没有了解的同学一定要先去了解完其原理再看本篇题解。
好,那么我们接下来去分析这道题目,题目的要求其实就是选择一个数,然后让数组中所有小于该数的值变为0,然后统计数组中的非零段数目的最大值,我们怎么去设计这个差分思路:我们的 p 假设从一个特别大的值开始取,一直让p --
那么当p == a[i](max)
即当p
等于数组a
中的最大值时,会出现第一个非零段,这里我们把出现的非零段称为一个凸点,那么按照这个思路继续让p --
,当我们每出现一个凸点的时候,我们的非零段就会多一个;接下来去思考什么情况会让非零段减少呢?即当两个凸点中间出现一个小的数字,这里举一个例子,设数组a
为[6 4 6]
,那么当p == 5
的时候,数组a
为[6 0 6]
,显然是有两个凸点(均为6
),即非零段的个数为2
。那么此时我们按照先前思路,执行p --
, 那么这个时候p == 4
,数组a
变为[6 4 6]
,非零段的个数变为1
,即当两个大数之间出现一个小数的话,我们的非零段个数就会变少,我在这里称这个点为凹点。
综上所述,我们得到结论:每当一个凸点出现的时候,非零段的个数就会增加,否则非零段的个数就会减少,我们用数组b
去表示这个过程,b[i]
即表示当p
的值等于i
的时候,非零段个数的变化,最后我们的最大值只需要求一次前缀和(求的过程中不断取max
)即可。
C++
#include <iostream>
#include <algorithm>using namespace std;const int N = 500010;int a[N], b[N];int main()
{int n;cin >> n;for(int i = 1; i <= n; i ++ ){cin >> a[i];if(a[i] > a[i - 1]){b[a[i - 1]] ++;b[a[i]] --;}}int ans = 0, t = 0;for(int i = 0;i < N;i ++ ){t += b[i];ans = max(ans, t);}cout << ans << endl;return 0;
}
用去重函数unique
去除重复的元素版:
#include <iostream>
#include <algorithm>using namespace std;const int N = 10010, M = 500010;int a[M], b[N];int main()
{int n;cin >> n;for (int i = 1; i <= n; i ++ )cin >> a[i];int m = unique(a, a + n + 2) - a;for (int i = 1; i < m; i ++ ) {if (a[i] > a[i - 1] && a[i] > a[i + 1])b[a[i]] ++;if (a[i] < a[i - 1] && a[i] < a[i + 1])b[a[i]] --;}int ans = 0, t = 0;for (int i = N; i; i -- ){t += b[i];ans = max(ans, t);}cout << ans << endl;return 0;
}
总结
标准的一道前缀和 + 差分的题目(这几次考试第二题好像都设计前缀和的思想了
前缀和
差分
202109-2 非零段划分相关推荐
- CSP:CSP认证考试:202109-2(非零段划分)70分答案,Java版
CSP:CSP认证考试:202109-2(非零段划分)70分答案,Java版 一.题目: 二.Java70分答案 import java.util.ArrayList; import java.uti ...
- csp真题 202109-2非零段划分C++代码(100分)
试题编号: 202109-2 试题名称: 非零段划分 时间限制: 1.0s 内存限制: 512.0MB 样例1输入 11 3 1 2 0 0 2 0 4 5 0 2 样例1输出 5 样例1解释 p=2 ...
- CCF202109-2 非零段划分
主要用到差分法 借用岛屿情况来分析这个题.考虑p足够大的情况,所有的数都被海水淹没了,只有0个岛屿.然后,海平面逐渐下降,岛屿数量出现变化.每当一个凸峰出现,岛屿数就会多一个:每当一个凹谷出现,原本相 ...
- CCF202109-2 非零段划分(100分)【序列处理】
试题编号: 202109-2 试题名称: 非零段划分 时间限制: 1.0s 内存限制: 512.0MB 问题描述: 题目描述 A1,A2,-,An是一个由 n 个自然数(非负整数)组成的数组.我们称其 ...
- 非零段划分(CSP202109-2)
非零段划分 题目链接 题目描述: 输入格式: 输出格式: 样例1: 输入: 11 3 1 2 0 0 2 0 4 5 0 2 输出: 5 样例2: 输入: 14 5 1 20 10 10 10 10 ...
- CSP 202109-2 非零段划分
题目链接:非零段划分 题目描述 A1,A2,⋯,An 是一个由 n 个自然数(非负整数)组成的数组.我们称其中 Ai,⋯,Aj 是一个非零段,当且仅当以下条件同时满足: 1≤i≤j≤n: 对于任意的整 ...
- 非零基础自学计算机操作系统 第1章 操作系统概述 习题一
非零基础自学计算机操作系统 第1章 操作系统概述 习题一 [1]什么是操作系统?操作系统有哪些特性? 答:操作系统是管理计算机硬件与软件资源的计算机程序,它的主要特性有并发性.易用性.稳定性和异步性. ...
- 非零基础自学计算机操作系统 第1章 操作系统概述 1.4 操作系统的分类 1.4.1 多道批处理操作系统 1.4.2 分时操作系统
非零基础自学计算机操作系统 文章目录 非零基础自学计算机操作系统 第1章 操作系统概述 1.4 操作系统的分类 1.4.1 多道批处理操作系统 1.4.2 分时操作系统 第1章 操作系统概述 1.4 ...
- Keil MDK下如何设置非零初始化变量(转)
源:Keil MDK下如何设置非零初始化变量 一些工控产品,当系统复位后(非上电复位),可能要求保持住复位前RAM中的数据,用来快速恢复现场,或者不至于因瞬间复位而重启现场设备.而keil mdk在默 ...
- 网络故障解决方案之非标准子网划分【网管员必懂】
网络故障解决方案之非标准子网划分 一个组织申请了一段IP地址后,可能需要对IP地址进行进一步的子网划分.例如,某规模较大的公司申请了一个B类IP地址166.133.0.0.如果采用标准子网掩码255. ...
最新文章
- ToDictionary的用法
- 何恺明团队新作!深度学习网络架构新视角:通过相关图表达理解神经网络
- 【转载】反向代理为何叫反向代理?
- 云时代传统服务器被“唱衰”,服务器厂商面临“大考”
- JZOJ 3766. 【BJOI2014】大融合
- UVa 10061 How many zero's and how many digits?
- lock字段mysql_MySQL的lock tables和unlock tables的用法(转载)
- Fastformer:史上最强最快Transformer!清华、MSRA出品!
- java的异常处理块的形式_Java 异常处理详细解读
- 2021年中国电子陶瓷市场趋势报告、技术动态创新及2027年市场预测
- 国防科大登顶SQuAD 2.0排行榜,机器阅读也要“不知为不知”
- MSN登陆以后没有响应处理方法
- VMware虚拟机网络设置
- 53、backtrader的一些基本概念---如何用backtrader画图?
- HDU 6045 Is Derek lying? 水题
- 自己总结关于浏览器证书安全的二点小技巧
- Ocr 图文识别技术——基于百度云OCR技术学习与总结
- 将web网站转为App
- 【Windows】回收站添加快捷键B
- 客运售票员_见过这样的客运售票员吗