zoukankan      html  css  js  c++  java
  • AC dream 1099 瑶瑶的第K大

    题意就是从一个无序的数组中找出第k大的数,由于数据很多,容易TLE,而且数组中的元素很大,用hash会MLE;

    解法一:

    /*

    利用STL库函数:nth_element(start, start+n, end)(头文件是<algorithm>)

    使第n大元素处于第n位置(从0开始,其位置是下标为n的元素),并且比这个元素小的元素都排在这个元素之前,比这个元素大的元素都排在这个元素之后,但不能保证他们是有序的。

    */
    #include <iostream> #include <cstdio> #include <algorithm> #define LL long long #define N 6000020 using namespace std; int a[N]; int main() { int n,k,i; cin>>n>>k; for(i=0; i<n; i++) scanf("%d",&a[i]); nth_element(a,a+n-k+1,a+n); printf("%d ",a[n-k]); return 0; }

    解法二:

    /*

    解法二:

    快排的思想:

    加个优化,快排的时候把比枢轴(用来做被比较的标准数)大于等于的放在前面,小的放后面;

    ***********************优化重点来了**********************

    若是比枢轴大的数的个数比k大,那么只需要递归左边的区域,否则递归右边的区域

    ************************************************************


    */
    #include <iostream> #include <queue> #include <cstdio> #include <algorithm> #define LL long long #define N 6000020 using namespace std; int a[N],n,k; int mysort(int left,int right) { int l=left,r=right; if(l<r) { int x=a[l]; while(l<r) { while( l<r && a[r]<x) r--; if(l<r) { a[l]=a[r]; l++; } while( l<r && a[l]>=x) l++; if(l<r) { a[r]=a[l]; r--; } } a[l]=x; if(l==k) return l; if(l>k)/* 此处的优化 */ mysort(left,l-1); else mysort(l+1,right); } } int main() { int i; cin>>n>>k; for(i=1; i<=n; i++) scanf("%d",&a[i]); mysort(1,n); printf("%d ",a[k]); return 0; }
  • 相关阅读:
    idea spring boot启动项目上面有红色叉
    hibernate Criteria中多个or和and的用法 and ( or or)
    CAS Server 4.2.7(自定义密码验证) 部署
    Web应用系统集成CAS-rest指南
    用DBMS_REDEFINITION将普通表转换为分区表
    windows编译libevent时报告“缺少print_winsock_errors.obj”的解决
    Oracle表增删分区的脚本
    libcassandra开发示例
    关于MongoDB API的两个小经验
    C/C++开发Cassandra的一些经验
  • 原文地址:https://www.cnblogs.com/yu0111/p/5452021.html
Copyright © 2011-2022 走看看