CSP 2021-9-2 非零段数组的划分

答案(100分)

#include 
using namespace std;
const int maxn=50000+5;
set<int> pnumber;//目的:不需要从p=2遍历到max值,只需遍历出现过的数字即可 
vector<int> loc[maxn];//目的:快速定位每个数字的下标位置
int n;
vector<int> A;//保存数组 
int main()
{
	scanf("%d",&n);
	//注意:刚开始没有开辟vector的空间不能写A[]这样!!会报错 
	A.push_back(0);//A[0]
	int ans=0,c;
	for(int i=1;i<=n;i++){
		scanf("%d",&c);
		A.push_back(c);
		pnumber.insert(A[i]);
		loc[A[i]].push_back(i);
	}
	A.push_back(0);//A[n+1]
	if(pnumber.size()==1) ans=A[1]?1:0;
	//查找本身的非零段
	for(int i=1;i<=n;i++){
		if((A[i]>0)&&(A[i-1]==0))
			ans++;
	}
	int res=ans;
	//遍历每一个数字,并将该数字在A中的地方所有值都变为0 
	set<int>::iterator p=pnumber.begin();
	if(*p==0) p++;//原本就是0,不需要变化 
	for(;p!=pnumber.end();p++){
		vector<int> &tmp=loc[*p];
		for(int i=0;i<tmp.size();i++){
			int sit=tmp[i];
			A[sit]=0;
			if(A[sit-1]!=0&&A[sit+1]!=0) res++;//新划分出非零段 
			if(A[sit-1]==0&&A[sit+1]==0) res--;//划分导致非零段数目减少 
		}
		ans=max(ans,res); 
	}
	cout<<ans<<endl;
	return 0;
}

小结

1.set容器:自动去重+升序
2.vector容器:可以定义一个数组来保存出现的数字所对应的所有下标
3.刚开始没有开辟vector的空间不能写A[]这样!!会报错
4.max库函数的应用:比较两个数值的大小
5.可以使用赋值的方式来赋值一个容器到另一个容器
eg:

vector<int> v1={0,1,2,3};
vector<int> v2=v1;//将v1赋值给v2
vector<int> v(100);//开辟一个空间大小为100的容器
vector<int> v(100,0);//开辟一个空间大小为100的容器,并初始化数值均为0

6.map容器未赋值前,默认所有的键值value均为0

你可能感兴趣的:(CSP,算法,c++,csp)