码迷,mamicode.com
首页 > 其他好文 > 详细

AC dream 1099 瑶瑶的第K大

时间:2016-05-02 11:45:10      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:

题意就是从一个无序的数组中找出第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\n",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\n",a[k]);
    return 0;
}

 

AC dream 1099 瑶瑶的第K大

标签:

原文地址:http://www.cnblogs.com/yu0111/p/5452021.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!