To_Heart—题解——收集雪花

题目描述
不同的雪花往往有不同的形状。在北方的同学想将雪花收集起来,作为礼物送给在南方的同学们。一共有n个时刻,给出每个时刻下落雪花的形状,用不同的整数表示不同的形状。在收集的过程中,同学们不希望有重复的雪花。你可以从任意  a时刻开始,在  b时刻停止。a到  b时刻中间的雪花也都将被收集。他们希望收集的雪花最多。

输入格式
第一行一个正整数 ;

第 2行n个非负整数表示n个时刻雪花的形状。

输出格式
最多能收集雪花的数量。

样例
输入样例
5
1 2 3 2 1
输出样例
3
#include<bits/stdc++.h>
using namespace std;
int a[1000005];
map<int,int>m;
int main(){
	int n;
	int j=1,ans=0;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		if(m.find(a[i])!=m.end()){ 	//如果当前这个数曾经出现过; 
			while(a[j]!=a[i]) 		//a[j]枚举第一个出现的与a[i]相同的数; 
				m.erase(m.find(a[j++]));    /*把a[j]以前的数全部删掉,包括a[j],
				因为以前的最大值已经放进ans里面了,不需要使用,只需要统计a[j+1]到a[i]的情况就好了*/ 
			j++;  //a[j]也不需要了; 
		}
		else m[a[i]]=1;  //否则直接打标记即可 
		ans=max(ans,i-j+1);
	}
	printf("%d",ans);
	return 0;
}
posted @ 2020-07-26 21:54  To_Heart  阅读(100)  评论(0编辑  收藏  举报