• PAT乙级1045 快速排序


    1045 快速排序 (25分)
     

    著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边。 给定划分后的 N 个互不相同的正整数的排列,请问有多少个元素可能是划分前选取的主元?

    例如给定 $N = 5$, 排列是1、3、2、4、5。则:

    • 1 的左边没有元素,右边的元素都比它大,所以它可能是主元;
    • 尽管 3 的左边元素都比它小,但其右边的 2 比它小,所以它不能是主元;
    • 尽管 2 的右边元素都比它大,但其左边的 3 比它大,所以它不能是主元;
    • 类似原因,4 和 5 都可能是主元。

    因此,有 3 个元素可能是主元。

    输入格式:

    输入在第 1 行中给出一个正整数 N(≤); 第 2 行是空格分隔的 N 个不同的正整数,每个数不超过 1。

    输出格式:

    在第 1 行中输出有可能是主元的元素个数;在第 2 行中按递增顺序输出这些元素,其间以 1 个空格分隔,行首尾不得有多余空格。

    输入样例:

    5
    1 3 2 4 5
    

    输出样例:

    3
    1 4 5

    递推预处理数组左边的最大值,预处理右边的最小值

     1 #include <iostream>
     2 #include <cstring>
     3 #include <algorithm>
     4 #include <vector>
     5 
     6 using namespace std ;
     7 
     8 const int N = 100010 ;
     9 int pre[N],nxt[N] ;
    10 int q[N] ;
    11 int n ;
    12 
    13 int main(){
    14     cin >> n ;
    15     
    16     for(int i=0;i<n;i++){
    17         cin >> q[i] ;
    18     }
    19     
    20     int l = q[0], r = q[n-1] ;
    21     for(int i=0;i<n;i++){
    22         l = max(q[i],l) ;
    23         pre[i] = l ;
    24     }    
    25     
    26     for(int i=n-1;i>=0;i--){
    27         r = min(q[i],r) ;
    28         nxt[i] = r ;
    29     }
    30 
    31 
    32     vector<int> vc ;
    33     for(int i=0;i<n;i++){
    34         if(i == 0 ){
    35             if(nxt[i+1]>q[i]){
    36                 vc.push_back(q[i]) ;
    37             }
    38         }else if(i == n-1){
    39             if(pre[i-1]<q[i]){
    40                 vc.push_back(q[i]) ;
    41             }
    42         }else{
    43             if(q[i]>pre[i-1] && q[i]<nxt[i+1]){
    44                 vc.push_back(q[i]) ;
    45             }
    46         }
    47     }
    48     int ans = vc.size() ;
    49     cout << ans << endl ;
    50     int la = vc.size() ;
    51     for(int i=0;i<ans;i++){
    52         if(i!=ans-1){
    53             printf("%d ",vc[i]) ;
    54         }else{
    55             printf("%d",vc[i]) ;
    56         }
    57     }
    58     cout << endl ;//最后要输出一个回车,不然有个数据点会格式错误
    59     return 0 ;    
    60 } 
  • 相关阅读:
    js键盘事件
    jq 插件写法
    js 去除字符串空白符
    C# ExpandoObject用法
    C# dynamic与var的区别
    c# 可选参数与命名实参
    C# 扩展方法
    python运算符
    【HDOJ】3006 The Number of set
    【HDOJ】3205 Factorization
  • 原文地址:https://www.cnblogs.com/gulangyuzzz/p/12028549.html
Copyright © 2020-2023  润新知