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算法,想起自己刚入队的时候的手足无措,现在也算是慢慢适应了吧。。时间过得真快啊。。。
对应题解代码: