pat-1101

由硬算超时,到找到规律的我哈哈哈~~~ 

#include<iostream>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;
const int inf=1000000000;
set<int>ans,temp;
int main(){
	int n;
	cin>>n;
	vector<int> a(n);
	for(int i=0;i<n;i++){
		scanf("%d",&a[i]);
		temp.insert(a[i]);
	}
	  int u=0,max=0,min[n],minn=inf;
	  fill(min,min+n,inf);
	  for(int i=n-1;i>=0;i--){
	  	if(a[i]<minn){
	  		minn=a[i];
	  		min[i]=minn;
		  }
	  }
	for(auto it=temp.begin();it!=temp.end();it++){
		if(a[u]>max) max=a[u];
		if(*it==a[u]&&max<=*it&&min[u]>=*it)
		ans.insert(*it);
		u++; 
	}
       /* for(int i=0;i<n;i++){
		int flag=0;
		for(int j=0;j<n;j++){
			if(i>=j){
				if(a[j]>a[i]) flag=1;
			}
			else{
				if(a[j]<a[i]) flag=1;
			}
		}
		if(flag==0){
			ans.insert(a[i]);
		}
	}*/ 
	printf("%d\n",ans.size());
	for(auto it=ans.begin();it!=ans.end();it++){
		if(it!=ans.begin())printf(" ");
		printf("%d",*it);
	}
	printf("\n");
	return 0;
}

总结

1.本题如果直接进行双重for循环会直接超时4个点,见我注释掉的部分,后来改进方法,如果是符合条件的,左小右大,则顺序也和set中的一样,当然这只是入门条件,还需要找出他左边的最大值,右边的最小值,当于当下元素比较,没有嵌套的for循环,由乘法变成加法,结果还有一个点格式错误,最后再加一个换行就好啦~~~

2.unorderer_set,就是省略了排序的set那还有个鸟用,map省略排序还行,毕竟map的排序确实一般用不到(没用过实话),所以如果用set,只能用set

3.格式不对时最后加个换行试试

4.事先建立最大最小值列表减少for循环嵌套好好总结一下注意边界条件

英语

无 

猜你喜欢

转载自blog.csdn.net/m0_45359314/article/details/113098182