
目录
题目来源
问题描述
题目描述
输入格式
输出格式
样例1输入
样例1输出
样例1解释
样例2输入
样例2输出
样例2解释
样例3输入
样例3输出
样例3解释
样例4输入
样例4输出
样例4解释
子任务
解题思路
代码
题目来源
计算机软件能力认证考试系统
问题描述| 试题编号: | 202109-2 |
| 试题名称: | 非零段划分 |
| 时间限制: | 1.0s |
| 内存限制: | 512.0MB |
| 问题描述: | 题目描述 A1,A2,⋯,An 是一个由 n 个自然数(非负整数)组成的数组。 我们称其中 Ai,⋯,Aj 是一个非零段,当且仅当以下条件同时满足:
下面展示了几个简单的例子:
现在我们可以对数组 A 进行如下 *** 作:任选一个正整数 p,然后将 A 中所有小于 p 的数都变为 0。 试选取一个合适的 p,使得数组 A 中的非零段个数达到最大。 若输入的 A 所含非零段数已达最大值,可取 p=1,即不对 A 做任何修改。 从标准输入读入数据。 输入的第一行包含一个正整数 n。 输入的第二行包含 n 个用空格分隔的自然数 A1,A2,⋯,An。 输出到标准输出。 仅输出一个整数,表示对数组 A 进行 *** 作后,其非零段个数能达到的最大值。 Data 样例1输出 Data 样例1解释p=2 时,A=[3,0,2,0,0,2,0,4,5,0,2],5 个非零段依次为 [3]、[2]、[2]、[4,5] 和 [2];此时非零段个数达到最大。 Data 样例2输出 Data 样例2解释p=12 时,A=[0,0,20,0,0,0,0,15,0,20,0,0,0,15],4 个非零段依次为 [20]、[15]、[20] 和 [15];此时非零段个数达到最大。 Data 样例3输出 Data 样例3解释p=1 时,A=[1,0,0],此时仅有 1 个非零段 [1],非零段个数达到最大。 Data 样例4输出 Data 样例4解释无论 p 取何值,A 都不含有非零段,故非零段个数至多为 0。 70% 的测试数据满足 n≤1000; 全部的测试数据满足 n≤5×105,且数组 A 中的每一个数均不超过 104。 |
设 非零段 Ai......Aj, 1 <= i <= k<= j<=n, Ak > p。
1、先定义一个数组A,用于存放Ai, i 的范围为[0, n + 2]。
A[0] = 0。
(左右两端各放置一个0, 方便后续 *** 作)
2、一层 for 循环。
记录 A1......An ,当多个相同的数连在一起时,不记录多余的重复部分(去重)(如 2 3 3 4 5 -> 2 3 4 5)。
同时记录A数组的真实大小 ASize。
A[ASize - 1] = 0;
3、定义一个 map类型的变量 num2gap:{num, gaps}: 当 p = num时(num 来自 A1....An), 相对于前一个 p 值,增加或者减少的非零段数量 gaps(随意写的单词哈)。
4、一层 for 循环。
记录每个在A数组中的 Ai 的num2gap。
(具体方法下边讲)
5、初始化当前的非零段数 curGap = (num2gap.size() == 0? 0: 1)。
如果本组数据全为0, 那么非零段数为0(并且num2gap中无数据)。
如果本组数据不全为0, 则默认原始p值为-1,将整体的数据看成一个非零段,因为 Ai > -1, 所以初始为 1 。
此外, 定义一个记录最大非零段数的 ans = curGap。
6、一层 for 循环。
因为 map 是有序的, 所以(有序)遍历 map中的每个元素, 将当前 num对非零段数的影响加进来, 便是 当前 p = num 时, 本次数据的非零段数了。
同时也要记录 最大非零段数哦。
4 详解:
原始数据:
14
5 1 20 10 10 0 10 15 10 20 1 5 10 15
变成
ASize = 15
A = 0 5 1 20 10 0 10 15 10 20 1 5 10 15 0
因为本次数据不是全0, 所以 初始非零段数 curGap = 1。
当 p = 0时, curGap = 1 + 1 (A[4] > A[5] < A[6])= 2 。
所以 当 A[i-1] > A[i] < A[i +1] 时, 会增加一个非零段。
当 p = 1时, curGap = 2 + 2(A[1] > A[2] < A[3] / A[9] > A[10] < A[11] ) = 4。
当 p = 5时, curGap = 4 - 1(A[0] < A[1] > A[2]) + 0 (A[10] < A[11] < A[12]) = 3。
所以 当 A[i-1] < A[i] > A[i +1] 时, 会减少一个非零段; 当 A[i-1] < A[i] < A[i +1] 时, 非零段数量不变。
当 p = 10时, curGap = 3 + 0(A[3] > A[4] > A[5]) + 0 (A[5] < A[6] < A[7] / A[11] < A[12] < A[13] ) + 1 (A[7] > A[8] < A[9]) = 4。
当 A[i-1] > A[i] > A[i +1] 时, 非零段数量不变。
当 p = 15时, curGap = 4 - 2(A[6] < A[7] > A[8] / A[12] < A[13] > A[14]) = 2。
当 p = 20时, curGap = 2 - 2(A[2] < A[3] > A[4] / A[8] < A[9] > A[10]) = 0。
代码
#include
#include
#include
------------------------------------- 更新 ----------------------
内存稍微小一些:
将 中间的 A数组 换成了 prepre、 pre、 cur三个整型变量了。
代码:
#include
#include
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)