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; }
  • 相关阅读:
    APIO 2010 特别行动队 斜率优化DP
    洛谷 P2747 Canada Tour 周游加拿大 动态规划
    VIJOS-P1282 佳佳的魔法照片 排序
    [APIO2012]派遣 可并堆
    可并堆模板题-mergeable heap
    可并堆总结
    分治思想及树上点分治
    拉丁字母(英语)缩写
    区块链是什么?跟比特币有什么关系?
    究竟什么比特币?如何理解比特币?
  • 原文地址:https://www.cnblogs.com/yu0111/p/5452021.html
Copyright © 2011-2022 走看看