由硬算超时,到找到规律的我哈哈哈~~~
#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循环嵌套好好总结一下注意边界条件
英语
无