• [ USACO 2018 OPEN ] Out of Sorts (Silver)


    (\)

    (Description)


    运行以下代码对一长为(N)的数列(A)排序,不保证数列元素互异:

    cnt = 0
    sorted = false
    while (not sorted):
       cnt = cnt + 1
       sorted = true
       for i = 0 to N-2:
          if A[i+1] < A[i]:
             swap A[i], A[i+1]
             sorted = false
    

    求退出循环后(cnt)的值。

    • (Nin [0,10^5])(A_iin [0,10^9])

    (\)

    (Solution)


    • 其实就是正常的顺序冒泡排序,注意到在一次循环中,一个很大的数是会连续向后移动多次的,而小一点的数只会左移一位,因此我们只需统计出每一个数需要左移的次数取最大值就是答案。
    • 于是做法是记录下标后将数列排序,但是注意(sort)是不稳定的,因此需要双关键字,即相同的数字按照在原数列中的出现次序排序。

    (\)

    (Code)


    #include<cmath>
    #include<cstdio>
    #include<cctype>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define N 100010
    #define R register
    #define gc getchar
    using namespace std;
    
    inline int rd(){
        int x=0; bool f=0; char c=gc();
        while(!isdigit(c)){if(c=='-')f=1;c=gc();}
        while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();}
        return f?-x:x;
    }
    
    int n,ans;
    struct num{int x,p;}s[N];
    
    inline bool cmp(num x,num y){return x.x==y.x?x.p<y.p:x.x<y.x;}
    
    int main(){
        n=rd();
        for(R int i=1,x;i<=n;++i){s[i].x=rd();s[i].p=i;}
        sort(s+1,s+1+n,cmp);
        for(R int i=1;i<=n;++i) ans=max(ans,s[i].p-i+1);
        printf("%d
    ",ans);
        return 0;	
    }
    
  • 相关阅读:
    C语言I博客作业10
    C言I博客作业09
    C言I博客作业08
    C语言I博客作业07
    C语言I博客作业06
    C语言博客园作业05
    使用注解方式生成Hibernate映射文件
    技术英语单词中英文对照
    spring监听器
    Servlet
  • 原文地址:https://www.cnblogs.com/SGCollin/p/9660910.html
Copyright © 2020-2023  润新知