SDNU OJ 1060.找第K大数

Time Limit: 1000 MS Memory Limit: 32768 KB

Description

给定 n(1 <= n <= 10000000) 个正整数(<= 2147483647),找出其中的第K(1 <= K <= 10)大数。
Input

第一行,两个整数n, K,第二行n个整数
Output

第K大数
Sample Input

5 3
10 15 6 8 3
Sample Output

8

题目分析:
说到这个题,一般最先想到的算法肯定是先排序,然后再输出第K大的就可以了。但是可以看看这个题n的范围,我们的测评姬绝对是个抖S,数不出到最大不会放过你的。。所以即使是用C++编译器自带的sort函数排序也是会超时的,因此这里就另有一个算法,可以限制运算时的数据范围,提高运算速度。

/********
该算法的思想是:由于K的范围很小,所以定义范围约为K的数
组,在循环输入的过程中与数组中最小的元素作比较,只输入 
比它大的数字,其余的丢弃,这样在全部输入完成后 ,数组中 
只保留了K个最大的数字,大大减少了计算量与计算时间。 
********/ 
#include 
#include 
#include 
#include 
using namespace std;
    int a[11] = {0};//定义范围约为K的数组 
int main()
{
    bool cmp(int p,int q);
    int x,i = 0,n,K;
    scanf("%d",&n);
    scanf("%d",&K);
    while(i < n)
    {
        scanf("%d",&x);//将数字输入进缓存区 
        if(x>a[0])//判断缓存中的数字是否比数组中最小的元素大 
        {
            a[0] = x;//将符合规定的缓存中的数字赋给a[0]
            sort(a,a + 10,cmp);//对数组进行排序,使其中最小的元素始终位于a[0] 
        }
        i++;
    }
    printf("%d\n",a[10 - K]);//输出第K大的数 
return 0;
}

bool cmp(int p,int q)//定义sort函数的排序方式 
{
    return p < q;
}

话说这个题卡了我这个小白好几天。。弱的一匹。。
/**———-
|
|
|
|
我是华丽丽的分割线
|
|
|
|
———-**/
2018-08-13更新
过了快一年,看到了一个BFPRT算法,想起自己刚入队的时候的手足无措,现在也算是慢慢适应了吧。。时间过得真快啊。。。

对应题解代码:

你可能感兴趣的:(原创)