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 <cstdio>
#include <cstdlib>
#include <algorithm>
#include <iostream>
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算法,想起自己刚入队的时候的手足无措,现在也算是慢慢适应了吧。。时间过得真快啊。。。

对应题解代码:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值