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时,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分)相关推荐
- CSP:CSP认证考试:202109-2(非零段划分)70分答案,Java版
CSP:CSP认证考试:202109-2(非零段划分)70分答案,Java版 一.题目: 二.Java70分答案 import java.util.ArrayList; import java.uti ...
- CSP 202109-2 非零段划分
题目链接:非零段划分 题目描述 A1,A2,⋯,An 是一个由 n 个自然数(非负整数)组成的数组.我们称其中 Ai,⋯,Aj 是一个非零段,当且仅当以下条件同时满足: 1≤i≤j≤n: 对于任意的整 ...
- CCF202109-2 非零段划分(100分)【序列处理】
试题编号: 202109-2 试题名称: 非零段划分 时间限制: 1.0s 内存限制: 512.0MB 问题描述: 题目描述 A1,A2,-,An是一个由 n 个自然数(非负整数)组成的数组.我们称其 ...
- CCF202109-2 非零段划分
主要用到差分法 借用岛屿情况来分析这个题.考虑p足够大的情况,所有的数都被海水淹没了,只有0个岛屿.然后,海平面逐渐下降,岛屿数量出现变化.每当一个凸峰出现,岛屿数就会多一个:每当一个凹谷出现,原本相 ...
- 非零段划分(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 ...
- 【华为机试真题详解】数大雁【2022 Q2 | 100分】
文章目录 前言 详解试题 1419. 数青蛙 华为机试题. 数大雁 题目解析 数青蛙代码实现 数大雁不考虑叫声不完整的情况 数大雁考虑叫声不完整的情况 前言 <华为机试真题详解>专栏含牛客 ...
- 【华为机试真题 Python实现】奥运会排行榜【2022 Q1 | 100分】
文章目录 前言 题目描述 示例 1 参考代码 前言 <华为机试真题>专栏含牛客网华为专栏.华为面经试题.华为OD机试真题. 如果您在准备华为的面试,期间有想了解的可以私信我,我会尽可能帮您 ...
- 【华为机试真题详解】货币单位换算【2022 Q4 | 100分】
文章目录 前言 题目描述 输入描述 输出描述 示例 1 题目解析 参考代码 前言 <华为机试真题详解 Python实现>专栏含牛客网华为专栏.华为面经试题.华为OD机试真题. 如果您在准备 ...
- 【华为机试真题 Python实现】停车位问题【2022 Q2 | 100分】
文章目录 前言 题目描述 示例 1 参考代码 前言 <华为机试真题>专栏含牛客网华为专栏.华为面经试题.华为OD机试真题. 如果您在准备华为的面试,期间有想了解的可以私信我,我会尽可能帮您 ...
最新文章
- Kanzi常用操作3
- java多线程抽奖_java 线程池、多线程并发实战(生产者消费者模型 1 vs 10) 附案例源码...
- 机器人末端执行器气爪怎么吸合_平行气爪工作原理是什么?平行气爪原理图作用是什么...
- 极简易版专家聊天程序--JAVA练手
- java内存溢出总结(1.8)
- 45.UITableView去除分割线
- Python 告诉你:8.3 分口碑炸裂!潘粤明版《鬼吹灯》到底好看在哪儿?
- 哦?你会视频剪辑?是的。好,录用你!
- 表格列宽怎么设置?(excel表格)
- 29-基于单片机的防盗报警系统仿真
- java手机版头文字d_头文字D THE ARCADE
- 明日之后最好看的房子又来啦:情侣专属泰坦尼克号造型登场
- Ubuntu-18.04.5-desktop安装教程
- iOS 面试题集合~[有答案]
- 1343476-41-4,Acid-PEG5-NHS ester亲水性PEG间隔物增加了在水介质中的溶解度
- springboot中hibernate validator校验模式,分组校验,自定义校验
- live555学习(一)编译live555
- 分部声明一定不能指定不同的基类
- 运行出错 runtime error
- C#窗体应用 socket通信(一)