CSP:202109-2 非零段划分(c++)

CSP:202109-2 非零段划分

题目描述

A 1 , A 2 , ⋯   , A n A_1, A_2, \cdots, A_n A1,A2,,An 是一个由 n n n 个自然数(非负整数)组成的数组。我们称其中 A i , ⋯   , A j A_i, \cdots, A_j Ai,,Aj 是一个非零段,当且仅当以下条件同时满足:

  • 1 ≤ i ≤ j ≤ n 1 \le i \le j \le n 1ijn
  • 对于任意的整数 k k k,若 i ≤ k ≤ j i \le k \le j ikj,则 A k > 0 A_k > 0 Ak>0
  • i = 1 i= 1 i=1 A i − 1 = 0 A_{i-1} = 0 Ai1=0
  • j = n j = n j=n A j + 1 = 0 A_{j+1} = 0 Aj+1=0

下面展示了几个简单的例子:

  • A = [ 3 , 1 , 2 , 0 , 0 , 2 , 0 , 4 , 5 , 0 , 2 ] A = [3, 1, 2, 0, 0, 2, 0, 4, 5, 0, 2] A=[3,1,2,0,0,2,0,4,5,0,2] 中的 4 4 4 个非零段依次为 [ 3 , 1 , 2 ] [3, 1,2] [3,1,2] [ 2 ] [2] [2] [ 4 , 5 ] [4, 5] [4,5] [ 2 ] [2] [2]
  • A = [ 2 , 3 , 1 , 4 , 5 ] A = [2, 3, 1, 4, 5] A=[2,3,1,4,5] 仅有 1 1 1 个非零段;
  • A = [ 0 , 0 , 0 ] A = [0, 0, 0] A=[0,0,0] 则不含非零段(即非零段个数为 0 0 0)。

现在我们可以对数组 A A A 进行如下操作:任选一个正整数 p p p,然后将 A A A 中所有小于 p p p 的数都变为 0 0 0。试选取一个合适的 p p p,使得数组 A A A 中的非零段个数达到最大。若输入的 A A A 所含非零段数已达最大值,可取 p = 1 p=1 p=1,即不对 A A A 做任何修改。

输入格式

从标准输入读入数据。

输入的第一行包含一个正整数 n n n

输入的第二行包含 n n n 个用空格分隔的自然数 A 1 , A 2 , ⋯   , A n A_1, A_2, \cdots, A_n A1,A2,,An

输出格式

输出到标准输出。

仅输出一个整数,表示对数组 A A A 进行操作后,其非零段个数能达到的最大值。

样例1输入
11
3 1 2 0 0 2 0 4 5 0 2
样例1输出
5
样例1解释

p = 2 p = 2 p=2 时, A = [ 3 , 0 , 2 , 0 , 0 , 2 , 0 , 4 , 5 , 0 , 2 ] A = [3, 0, 2, 0, 0, 2, 0, 4, 5, 0, 2] A=[3,0,2,0,0,2,0,4,5,0,2] 5 5 5 个非零段依次为 [ 3 ] [3] [3] [ 2 ] [2] [2] [ 2 ] [2] [2] [ 4 , 5 ] [4, 5] [4,5] [ 2 ] [2] [2];此时非零段个数达到最大。

样例2输入
14
5 1 20 10 10 10 10 15 10 20 1 5 10 15
样例2输出
4
样例2解释

p = 12 p = 12 p=12 时, A = [ 0 , 0 , 20 , 0 , 0 , 0 , 0 , 15 , 0 , 20 , 0 , 0 , 0 , 15 ] A = [0, 0, 20, 0, 0, 0, 0, 15, 0, 20, 0, 0, 0, 15] A=[0,0,20,0,0,0,0,15,0,20,0,0,0,15] 4 4 4 个非零段依次为 [ 20 ] [20] [20] [ 15 ] [15] [15] [ 20 ] [20] [20] [ 15 ] [15] [15];此时非零段个数达到最大。

样例3输入
3
1 0 0
样例3输出
1
样例3解释

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

样例4输入
3
0 0 0
样例4输出
0
样例4解释

无论 p p p 取何值, A A A 都不含有非零段,故非零段个数至多为 0 0 0

子任务

70 % 70\% 70% 的测试数据满足 n ≤ 1000 n \le 1000 n1000

全部的测试数据满足 n ≤ 5 × 1 0 5 n \le 5 \times 10^{5} n5×105,且数组 A A A 中的每一个数均不超过 1 0 4 10^{4} 104

code
#include<iostream>
#include<set>
using namespace std;

int number[500000]={0};
int number1[500000]={0};
int main(){
	int n,max=0,qwe=0;
	set<int>st;
	cin>>n;
	int mn;
	for(int b=0;b<n;b++){
		cin>>mn;
		if(number[qwe]!=mn){
			qwe++;
			number[qwe]=mn;
			st.insert(number[qwe]);
		}
	}
	n=qwe+1;
	int asd=0;
	for(int a=0,key=0,zero=1;a<n;a++){
		if(number[a]==0)
			asd=1;
		if(number[a])
			zero=1;
		else zero=0;
		if(key==0&&zero==1){
			max++;
			key=1;
		}
		if(key==1&&zero==0){
			key=0;
		}
	}
	if(asd==0)
		max--;
	for(int a=0,key=0,zero=1,qwe=0,rty;a<n;a++){
		if(number[a]){
			if(a==0){
				if(number[1]<number[0])
					number1[number[0]]--;
				}
			else if(a==n-1){
				if(number[n-2]<number[n-1])
					number1[number[a]]--;
			}
			else if(number[a]>number[a-1]&&number[a]>number[a+1])
				number1[number[a]]--;
			else if(number[a]<number[a-1]&&number[a]<number[a+1])
				number1[number[a]]++;
		}
	}
	int mmm=0,mmn=0;
	for(set<int>::iterator it=st.begin();it!=st.end();it++){
		mmn+=number1[*it];
		if(mmn>mmm)
			mmm=mmn;
	}
	if(mmm>0)
		max+=mmm;
	cout<<max;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值