样例(可复制)
5
1 3 2 4 5
样例输出
3
1 4 5
注意点
- 本题需要使用一个技巧,先记录每个位上之前出现过的最大数,以及每位上之后出现过的最小数,再遍历整个数组,如果当前数比之前的数大,比之后的数小,则为主元。
- const int INF=0x3fffffff;定义了一个很大的数
- 注意本题结束后必须要有换行,否则有个测试点会报格式错误
#include <bits/stdc++.h>
using namespace std;
const int INF=0x3fffffff;
int a[100010]={0},leftmax[100010],rightmin[100010],ans[100010];
int main(){
int n,sum=0;
cin>>n;
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
rightmin[n-1]=a[n];rightmin[n]=INF;
for(int i=2;i<=n;i++)leftmax[i]=max(a[i-1],leftmax[i-2]);
for(int i=n-2;i>=0;i--)rightmin[i]=min(a[i+1],rightmin[i+2]);
for(int i=1;i<=n;i++){
if(a[i]>leftmax[i]&&a[i]<rightmin[i]){
ans[sum]=a[i];
sum++;
}
}
cout<<sum<<"\n";
for(int i=0;i<sum;i++){
printf("%d",ans[i]);
if(i!=sum-1)printf(" ");
}
cout<<"\n";
return 0;
}