根据题意可以确定若元素为主元,那么它的位置是固定的(就是排序之后,该元素的位置不变)。因此我们只需要对于列表进行排序之后,与原列表进行比较,对应位置元素没有变化时则为主元。
代码:
#include<stdio.h>
#include<stdlib.h>
int cmp(const void *a,const void *b){
return (*(int *)a-*(int *)b);
}
int main()
{
int max=0,n,a1[100000],a2[100000],a3[100000],b,c=0,d=0;
scanf("%d",&n);
for(b=0;b<n;b++){
scanf("%d",&a1[b]);
a2[b]=a1[b];
}
qsort(a1,n,sizeof(a1[0]),cmp);
for(b=0;b<n;b++){
if(a1[b]==a2[b]&&a1[b]>max)
a3[d++]=a2[b];
if(a2[b]>max)
max=a2[b];
}
printf("%d\n",d);
for(b=0;b<d;b++){
if(b!=0)
printf(" ");
printf("%d",a3[b]);
}
printf("\n");
return 0;
}