这题的注意点是当主元个数为零时也要输出一个换行,否则会有格式错误。
题目链接
#include<cstdio>
#include<algorithm>
using namespace std;
int sequence[100001],Max[100001],Min[100001],pivot[100001];
//sequence是给定序列,Max[i]是包括当前位在内及右边元素的最大值,Min[i]是包括当前位在内及左边元素的最小值,pivot存储最终的主元
int main(){
int n,count=0;//count用来累计主元个数
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",sequence+i);
//输入序列,同时处理Max数组
if(i==0) Max[0]=sequence[0];//第一个元素的最大值就是它本身
else {//非首个元素
if(sequence[i]>Max[i-1]) Max[i]=sequence[i];
//如果当前元素大于右边元素的最大值,它就是最大值
else Max[i]=Max[i-1];
//否则继承当前最大值
}
}
Min[n-1]=sequence[n-1];
//最右边的元素的最小值就是它本身
if(sequence[n-1]==Max[n-1])
//如果它还是当前位置及左边元素的最大值,那它可能是主元
pivot[count++]=sequence[n-1];
for(int i=n-2;i>=0;i--){//从右到左检查
if(sequence[i]<Min[i+1]) {
//当前元素比右边元素的最小值更小,更新最小值
Min[i]=sequence[i];
if(sequence[i]==Max[i]){//且还比右边元素都大
pivot[count++]=sequence[i];//可能是主元
}
}
else Min[i]=Min[i+1];
}
printf("%d\n",count);
sort(pivot,pivot+count);//将可能的主元从小到大排列
for(int i=0;i<count;i++){
printf("%d",pivot[i]);
if(i<count-1) printf(" ");//控制空格
}
printf("\n");//必须得输出这个换行
return 0;
}