首页 > 代码库 > Vijos1788 第K大
Vijos1788 第K大
1.题意:给定N个数字,和一个值K,要求输出一组数据中第K大的数字,其中30%的测试点满足:n <= 100;60%的测试点满足:n <= 1000;100%的测试点满足:n <= 100000;1 <= k <= n, 每个同学的分数在[0,32767]之间;
2.分析:最朴素的想法是对数据排序,然后直接得出结果,不过一般的sort()函数复杂度为O(nlogn),不是很快。这里可以注意到,输入数据的范围并不大,在1e4这个数量级,这样我们开一个4e4的数组,读入数据时,用数组[i]表示i这个数是否在数据中以及出现了几次,这样能以O(n)的复杂度得到结果,代码如下(题设数据貌似用排序也能过)
1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 using namespace std; 5 const int MAXN=4e4; 6 int num[MAXN]; 7 int n,k; 8 void Init() 9 { 10 for(int i=0;i<MAXN;i++) 11 num[i]=-1; 12 for(int i=0;i<n;i++) 13 { 14 int temp; 15 scanf("%d",&temp); 16 if(num[temp]>=1) 17 num[temp]++; 18 else num[temp]=1; 19 } 20 } 21 void Solve() 22 { 23 int temp=0; 24 for(int i=MAXN-1;i>=0;i--) 25 { 26 if(num[i]>=1) 27 { 28 //printf("%d\n",i); 29 temp+=num[i]; 30 } 31 if(temp>=k) 32 { 33 printf("%d\n",i); 34 break; 35 } 36 } 37 } 38 int main() 39 { 40 while(scanf("%d%d",&n,&k)!=EOF) 41 { 42 Init(); 43 Solve(); 44 } 45 return 0; 46 }
Vijos1788 第K大
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。