CCF-CSP练习 非零段划分
CCF 202109-2 非零段划分
文章目录
题目描述
输入格式
输出格式
输出到标准输出。
仅输出一个整数,表示对数组A进行操作后,其非零段个数能达到的最大值。
样例1输入
11
3 1 2 0 0 2 0 4 5 0 2
样例1输出
5
样例1解释
样例2输入
14
5 1 20 10 10 10 10 15 10 20 1 5 10 15
样例2输出
4
样例2解释
样例3输入
3
1 0 0
样例3输出
1
样例3解释
样例4输入
3
0 0 0
样例4输出
0
样例4解释
子任务
我的提交
#include<bits/stdc++.h>
using namespace std;
int b[500006],c[500006],p[500006];//b[]是鞍部数组,c[]是a[]的副本,p[]是每个鞍部数作为p时的非零段个数
int main()
{
int n,a[500006],i,j,k,ans=0;
cin>>n;
for(i=0;i<n;i++)
{
cin>>a[i];
c[i]=a[i];
}
for(i=0;i<n;i++)
{
if(a[i]==0) break;
else if(a[i]<=a[i-1]&&a[i]<a[i+1])
{
b[i]=a[i];
//cout<<a[i]<<"<="<<a[i-1]<<"&&"<<a[i]<<"<"<<a[i+1]<<endl;
//cout<<b[i]<<endl;
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(c[j]!=0&&c[j]<=b[i])
{
//cout<<"b[i]="<<i<<"时,"<<c[j]<<"<="<<b[i]<<",c[j]变0"<<endl;//
c[j]=0;
}
}
for(k=0;k<n;k++)
{
if(c[k]!=0&&c[k]-c[k+1]==c[k])
p[i]++;
c[k]=a[k];
//cout<<"i="<<i<<"时,b[i]="<< b[i]<<"时,p[i]="<<p[i]<<endl;
}
if(p[i]>ans)//i>0&&
{
ans=p[i];
//cout<<"i="<<i<<"时,p[i]="<<p[i]<<">p[i-1]="<<p[i-1]<<",ans="<<ans<<endl;
}
}
cout<<ans<<endl;
}