试题编号: 202109-2
试题名称: 非零段划分
时间限制: 1.0s
内存限制: 512.0MB

样例1输入

11
3 1 2 0 0 2 0 4 5 0 2

样例1输出

5

样例1解释
p=2时,A=[3,0,2,0,0,2,0,4,5,0,2],5个非零段依次为[3]、[2]、[2]、[4、5]和[2];此时非零段个数达到最大。

样例2输入

14
5 1 20 10 10 10 10 15 10 20 1 5 10 15

样例2输出

4

样例2解释
p=12时,A=[0,0,20,0,0,0,0,15,0,20,0,0,0,15],4个非零段依次为[20]、[15]、[20]和[15];此时非零段个数达到最大。

样例3输入

3
1 0 0

样例3输出

1

样例3解释
p=1时,A=[1,0,0],此时仅有1个非零段[1],非零段个数达到最大。

样例4输入

3
0 0 0

样例4输出

0

样例4解释
无论p取何值,A都不含有非零段,故非零段个数至多为0。

70分代码及思路:
思路:
1.将所有数据存储到一个数组A中,并记录最大值max_A;
2.p从1开始遍历到最大值max_A,记录每一次p值下的非零段的个数最大值到数组max1中。
3.判断非零段个数:遍历数组,找到每一个不为0的值,如果该数前一个数为0或者该数是数组的第一个数,非零段个数加1。
4.遍历数组max1,输出最大值。
分析:
该方法属于常规思路,比较简单,无任何算法优化,有很多循环遍历,且有双层循环,由题目给出的数据范围,在双层循环中,循环次数有可能达到10^9,显然会超时。

#include <iostream>
using namespace std;int main()
{int n;int i=0,p=0,max_A=0,max=0;cin>>n;int A[n]={0};for(i=0;i<n;i++){cin>>A[i];if(A[i]>max_A)    //记录数组A中的最大值 {max_A=A[i];}}int max1[max_A]={0};   //开辟数组用来存储每一个p值下的非零段的最大值 for(p=1;p<max_A;p++) //p从1开始遍历 {for(i=0;i<n;i++)   //将数组中小于p的数置为0 {if(A[i]<p){A[i]=0;}}for(i=0;i<n;i++)  //遍历数组 {if(A[i]!=0){//若不为0,判断是否是数组的第一个数或者该数的前一个数为0,如果是,非零段加1 if(i==0||A[i-1]==0){max=max+1;}}}max1[p]=max;max=0;}for(i=1;i<max_A;i++)   if(max1[i]>max){max=max1[i];}cout<<max;return 0;
}

提交结果如下:

如果要拿到满分,那么用常规的思路逻辑肯定不行,必须要做一定的优化处理,在参考b站视频教程后整理如下:
1.读入数组时插入set,对数组进行去重和排序,(方便p值的选取)。
2.利用向量vector,将set集合中每个元素出现的位置存储在同一个vector向量中。
3.统计初始的非零段个数作为参考值。
(与前一种方法有点区别,在数组开头和最后加0,只需判断当前数不为0并且前一位数为0,非零段个数加1即可)
4.p依次从set中取值(从小到大)(如果值为0,跳过),依据位置向量获得每个值在数组A中的位置。
将对应位置的值赋值为0
如果该位置的前后的值都大于0,则非零段数加1;
如果该位置的前后的值都等于0,则非零段数减1;
其他情况下非零段个数不变。

更新非零段的最大值。
该方法的优点在于:
通过向量对应的位置坐标,判断坐标位置前后元素的值进行判断即可,不必在每一个p值下都对数组进行循环遍历,降低了时间复杂度。
此方法思路来源b站,可参考b站视频内容

满分代码:

#include <bits/stdc++.h>
using namespace std;int A[500002]= {0};
vector<int> Vector[10001];
set<int> Set;int main() {int n;cin>>n;for(int i=1; i<=n; i++) {cin>>A[i];Set.insert(A[i]);Vector[A[i]].push_back(i);}int number=0;    //非零段个数for(int i=1; i<=n; i++) { //找出当前非零段的个数if((A[i]>0)&&(A[i-1]==0))number++;}int temp;int number_max;  //非零段个数的最大值temp=number_max=number;set<int>::iterator p=Set.begin();//用迭代器来访问set集合//p的值从集合开始遍历if(*p==0)       //如果集合中的元素为0,则直接从下一个元素开始p++;for(p; p!=Set.end(); p++) {vector<int> &Vector1=Vector[*p];  //引用Vector[*p]为Vector1 for(int i=0; i<Vector1.size(); i++) {  //集合中该元素出现的总次数int k=Vector1[i];    A[k]=0;if((A[k-1]!=0)&&(A[k+1]!=0))temp++;if((A[k-1]==0)&&(A[k+1]==0))temp--;}number_max=max(number_max,temp);}cout<<number_max<<endl;return 0;}

提交结果如下:

csp真题 202109-2非零段划分C++代码(100分)相关推荐

  1. CSP:CSP认证考试:202109-2(非零段划分)70分答案,Java版

    CSP:CSP认证考试:202109-2(非零段划分)70分答案,Java版 一.题目: 二.Java70分答案 import java.util.ArrayList; import java.uti ...

  2. CSP 202109-2 非零段划分

    题目链接:非零段划分 题目描述 A1,A2,⋯,An 是一个由 n 个自然数(非负整数)组成的数组.我们称其中 Ai,⋯,Aj 是一个非零段,当且仅当以下条件同时满足: 1≤i≤j≤n: 对于任意的整 ...

  3. CCF202109-2 非零段划分(100分)【序列处理】

    试题编号: 202109-2 试题名称: 非零段划分 时间限制: 1.0s 内存限制: 512.0MB 问题描述: 题目描述 A1,A2,-,An是一个由 n 个自然数(非负整数)组成的数组.我们称其 ...

  4. CCF202109-2 非零段划分

    主要用到差分法 借用岛屿情况来分析这个题.考虑p足够大的情况,所有的数都被海水淹没了,只有0个岛屿.然后,海平面逐渐下降,岛屿数量出现变化.每当一个凸峰出现,岛屿数就会多一个:每当一个凹谷出现,原本相 ...

  5. 非零段划分(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 ...

  6. 【华为机试真题详解】数大雁【2022 Q2 | 100分】

    文章目录 前言 详解试题 1419. 数青蛙 华为机试题. 数大雁 题目解析 数青蛙代码实现 数大雁不考虑叫声不完整的情况 数大雁考虑叫声不完整的情况 前言 <华为机试真题详解>专栏含牛客 ...

  7. 【华为机试真题 Python实现】奥运会排行榜【2022 Q1 | 100分】

    文章目录 前言 题目描述 示例 1 参考代码 前言 <华为机试真题>专栏含牛客网华为专栏.华为面经试题.华为OD机试真题. 如果您在准备华为的面试,期间有想了解的可以私信我,我会尽可能帮您 ...

  8. 【华为机试真题详解】货币单位换算【2022 Q4 | 100分】

    文章目录 前言 题目描述 输入描述 输出描述 示例 1 题目解析 参考代码 前言 <华为机试真题详解 Python实现>专栏含牛客网华为专栏.华为面经试题.华为OD机试真题. 如果您在准备 ...

  9. 【华为机试真题 Python实现】停车位问题【2022 Q2 | 100分】

    文章目录 前言 题目描述 示例 1 参考代码 前言 <华为机试真题>专栏含牛客网华为专栏.华为面经试题.华为OD机试真题. 如果您在准备华为的面试,期间有想了解的可以私信我,我会尽可能帮您 ...

最新文章

  1. Kanzi常用操作3
  2. java多线程抽奖_java 线程池、多线程并发实战(生产者消费者模型 1 vs 10) 附案例源码...
  3. 机器人末端执行器气爪怎么吸合_平行气爪工作原理是什么?平行气爪原理图作用是什么...
  4. 极简易版专家聊天程序--JAVA练手
  5. java内存溢出总结(1.8)
  6. 45.UITableView去除分割线
  7. Python 告诉你:8.3 分口碑炸裂!潘粤明版《鬼吹灯》到底好看在哪儿?
  8. 哦?你会视频剪辑?是的。好,录用你!
  9. 表格列宽怎么设置?(excel表格)
  10. 29-基于单片机的防盗报警系统仿真
  11. java手机版头文字d_头文字D THE ARCADE
  12. 明日之后最好看的房子又来啦:情侣专属泰坦尼克号造型登场
  13. Ubuntu-18.04.5-desktop安装教程
  14. iOS 面试题集合~[有答案]
  15. 1343476-41-4,Acid-PEG5-NHS ester亲水性PEG间隔物增加了在水介质中的溶解度
  16. springboot中hibernate validator校验模式,分组校验,自定义校验
  17. live555学习(一)编译live555
  18. 分部声明一定不能指定不同的基类
  19. 运行出错 runtime error
  20. C#窗体应用 socket通信(一)

热门文章

  1. eclipse搜索框太小
  2. oracle监听无法启动常用解决办法
  3. python中popen的用法_python中的subprocess.Popen()使用
  4. OpenJDK8基础类库包清单
  5. 07 | 链表(下):如何轻松写出正确的链表代码?
  6. java 注入 循环_spring依赖注入——循环依赖
  7. 信息抽取--关键句提取
  8. leetcode 88
  9. git基础-远程仓库的使用
  10. 【STM32】IIC的基本原理(实例:普通IO口模拟IIC时序读取24C02)(转载)