PAT B1045/A1101 快速排序 (25point(s))

这题的注意点是当主元个数为零时也要输出一个换行,否则会有格式错误。
题目链接

#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;
}
发布了81 篇原创文章 · 获赞 0 · 访问量 665

猜你喜欢

转载自blog.csdn.net/weixin_44546393/article/details/105442480