非零段划分(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 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 及优化算法对于降低时间复杂度来说是非常有效的。
思路:
- 首先进行离散化,将题中所给的数据离散化为连续的数据。
- 利用vector向量,保存每个数据离散化后的位置(和离散化前位置应该一样)
- 从0开始,第一次把0的位置全部变成0(即进行标记);第二次把1的位置全部变成0…依此类推。 细节处理:假设x的位置要变为0,若x-1和x+1的位置均被标记过了,则非零段-1;若都没标记过,则非零段+1;若有其中一个被标记过了,则非零段不变。
- 特殊情况: 若数组元素全为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)相关推荐
- 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 个自然数(非负整数)组成的数组.我们称其 ...
- 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. ...
最新文章
- SVN可以拉项目但是提交时提示没有权限
- IDEA 强大的 Live Templates,代码生成利器
- python3中的新式类与经典类对比
- 这回,不用为Linux命令发愁了吧
- Flutter开发之诊断布局调试工具:inspector(12)
- linux 下 iscsi的简单使用
- JavaScript中的回调地狱及解决方法
- 都说变量有七八种,到底谁是 Java 的亲儿子
- org.apache.commons.io如何使用
- 计算机系统-程序加载器
- ajax跨域问题解决(spring boot)
- android_dialog
- Cortex-M可以跑Linux操作系统吗?
- Office2010激活失败 错误码2503、2502解决方案
- 无法打开文件“d3dx9.lib_三个小技巧,教会你解决无法打开手机文件问题
- Android 10 手机端控制车载蓝牙音乐上一首、暂停、下一首、获取音乐信息等流程
- iPhone软件开发完美起步
- C语言----文件存储
- 【flask】适合生产环境的高并发部署方案(gunicorn + gevent + supervisor)
- android自定义曲线控件,Android自定义折线图(可拖动显示)
热门文章
- 【输入法】Rime-中州韵 基本设置 附:官方定制指南
- tornado SQLAlchemy
- Codeforces Round #476 (Div. 2)
- Linux格式化分区报错Could not start /dev/sda No such file or directory 解决办法
- 在windows下添加php的Imagick扩展
- 2008社工新书《黑客社会工程学攻击》
- Node.js---02、node.js 模块加载机制
- Tomcat Maven插件分环境运行配置
- 恢复误删除的域用户及几个查询命令
- atitit.集合的filt操作细分 filter总结