非零段划分

题目链接

题目描述:

输入格式:

输出格式:


样例1:
输入:

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

输出:

5

样例2:
输入:

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

输出:

4

样例3:
输入:

3
1 0 0

输出:

1

样例4:
输入:

3
0 0 0

输出:

0

分析:首先暴力肯定是会超时的O(n^2).在没有找出规律(或者毫无规律可言)的情况下,借助C++ STL优化算法对于降低时间复杂度来说是非常有效的。

思路:

  1. 首先进行离散化,将题中所给的数据离散化为连续的数据。
  2. 利用vector向量,保存每个数据离散化后的位置(和离散化前位置应该一样)
  3. 从0开始,第一次把0的位置全部变成0(即进行标记);第二次把1的位置全部变成0…依此类推。 细节处理:假设x的位置要变为0,若x-1和x+1的位置均被标记过了,则非零段-1;若都没标记过,则非零段+1;若有其中一个被标记过了,则非零段不变。
  4. 特殊情况: 若数组元素全为0,则ans = 0;

时间复杂度几乎为:O(n)

这里给出两个版本,一个用到了离散化的。(离散化总结见主页其他博客)

优化版本:时间复杂度和空间复杂度都是最优。

#include <bits/stdc++.h>
#include <vector>
#include <algorithm>#define pb push_backusing namespace std;const int N = 500010;
const int M = 10010;
//int a[N];
bool book[N];
vector<int> vc[M];     // 存放位置 int main()
{int n;scanf("%d",&n);int p;for(int i=1;i<=n;i++){scanf("%d",&p);vc[p].pb(i);}book[0] = 1,book[n+1] = 1;int ans,res = 1;// res 保存上次的结果, backup 保存此次更新的结果 for(int i=0;i<=10000;i++){if(!vc[i].size())  continue;int backup = res;for(int j=0;j<(int)vc[i].size();j++){int x = vc[i][j];book[x] = 1;if(book[x-1] && book[x+1])    backup--;else if(!book[x-1] && !book[x+1]) backup++;}ans = max(ans,max(res,backup));res = backup;}if(vc[0].size()==n)        ans = 0;cout << ans << endl;return 0;
}

第一次写的:用到了离散化(其实不需要)

#include <bits/stdc++.h>
#include <vector>
#include <set>
#include <algorithm>#define fi first
#define se second
#define pb push_backusing namespace std;const int N = 500010;
typedef pair<int,int> PII;
PII a[N];
int b[N];
bool book[N];          // 标记位置
vector<int> vc[N];     // 存放离散后的位置 int main()
{int n;scanf("%d",&n);// 离散化 for(int i=1;i<=n;i++){scanf("%d",&a[i].fi);a[i].se = i;}sort(a+1,a+n+1);int pos = 1;for(int i=1;i<=n;i++){if(a[i].fi!=a[i-1].fi && i!=1)  pos++;b[a[i].se] = pos;}for(int i=1;i<=n;i++){vc[b[i]].pb(i);}book[0] = 1,book[n+1] = 1;int ans,res = 1;// res 保存上次的结果, backup 保存此次更新的结果 for(int i=1;i<=pos;i++){int backup = res;for(int j=0;j<(int)vc[i].size();j++){int x = vc[i][j];book[x] = 1;if(book[x-1] && book[x+1])   backup--;else if(!book[x-1] && !book[x+1]) backup++;}ans = max(ans,max(res,backup));res = backup;}if(pos==1&&a[n].fi==0)   ans = 0;       // 特殊情况:若数组元素全为0,则ans = 0;cout << ans << endl;return 0;
}

注:也可以不使用sort,使用set或者优先队列进行优化.目的是排序

非零段划分(CSP202109-2)相关推荐

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

  3. CCF202109-2 非零段划分

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

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

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

  5. CSP 202109-2 非零段划分

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

  6. 非零基础自学计算机操作系统 第1章 操作系统概述 习题一

    非零基础自学计算机操作系统 第1章 操作系统概述 习题一 [1]什么是操作系统?操作系统有哪些特性? 答:操作系统是管理计算机硬件与软件资源的计算机程序,它的主要特性有并发性.易用性.稳定性和异步性. ...

  7. 非零基础自学计算机操作系统 第1章 操作系统概述 1.4 操作系统的分类 1.4.1 多道批处理操作系统 1.4.2 分时操作系统

    非零基础自学计算机操作系统 文章目录 非零基础自学计算机操作系统 第1章 操作系统概述 1.4 操作系统的分类 1.4.1 多道批处理操作系统 1.4.2 分时操作系统 第1章 操作系统概述 1.4 ...

  8. Keil MDK下如何设置非零初始化变量(转)

    源:Keil MDK下如何设置非零初始化变量 一些工控产品,当系统复位后(非上电复位),可能要求保持住复位前RAM中的数据,用来快速恢复现场,或者不至于因瞬间复位而重启现场设备.而keil mdk在默 ...

  9. 网络故障解决方案之非标准子网划分【网管员必懂】

    网络故障解决方案之非标准子网划分 一个组织申请了一段IP地址后,可能需要对IP地址进行进一步的子网划分.例如,某规模较大的公司申请了一个B类IP地址166.133.0.0.如果采用标准子网掩码255. ...

最新文章

  1. SVN可以拉项目但是提交时提示没有权限
  2. IDEA 强大的 Live Templates,代码生成利器
  3. python3中的新式类与经典类对比
  4. 这回,不用为Linux命令发愁了吧
  5. Flutter开发之诊断布局调试工具:inspector(12)
  6. linux 下 iscsi的简单使用
  7. JavaScript中的回调地狱及解决方法
  8. 都说变量有七八种,到底谁是 Java 的亲儿子
  9. org.apache.commons.io如何使用
  10. 计算机系统-程序加载器
  11. ajax跨域问题解决(spring boot)
  12. android_dialog
  13. Cortex-M可以跑Linux操作系统吗?
  14. Office2010激活失败 错误码2503、2502解决方案
  15. 无法打开文件“d3dx9.lib_三个小技巧,教会你解决无法打开手机文件问题
  16. Android 10 手机端控制车载蓝牙音乐上一首、暂停、下一首、获取音乐信息等流程
  17. iPhone软件开发完美起步
  18. C语言----文件存储
  19. 【flask】适合生产环境的高并发部署方案(gunicorn + gevent + supervisor)
  20. android自定义曲线控件,Android自定义折线图(可拖动显示)

热门文章

  1. 【输入法】Rime-中州韵 基本设置 附:官方定制指南
  2. tornado SQLAlchemy
  3. Codeforces Round #476 (Div. 2)
  4. Linux格式化分区报错Could not start /dev/sda No such file or directory 解决办法
  5. 在windows下添加php的Imagick扩展
  6. 2008社工新书《黑客社会工程学攻击》
  7. Node.js---02、node.js 模块加载机制
  8. Tomcat Maven插件分环境运行配置
  9. 恢复误删除的域用户及几个查询命令
  10. atitit.集合的filt操作细分 filter总结