题目描述:

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。

输入:

每个测试案例包括2行:

第一行为2个整数n,k(1<=n,k<=200000),表示数组的长度。

第二行包含n个整数,表示这n个数,数组中的数的范围是[0,1000 000 000]。

输出:

对应每个测试案例,输出最小的k个数,并按从小到大顺序打印。

样例输入:
8 44 5 1 6 2 7 3 8
样例输出:
1 2 3 4                                                                                                                                               
思路:
面对如此规模的n,k采用一般方法肯定会超时的,我们维护一个K个元素的最大堆,(前K个元素初始化建堆),然后每次读入一个元素,就和堆顶元素相比较
如果该元素比堆顶元素大,那么跳过,否则更新堆顶元素,并调整堆,这样一遍之后,我们得到了最小的K个元素构成的最大堆,再排序即可。
代码:
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstdio>
using namespace std;
const int MAX=200001;
int min_k[MAX];
void heap_adj(int *a,int i,int len)
{
int index=i*2;
int p=2*i,q=p+1;
if(q<=len && a[p]<a[q]) index=q;
if(index<=len && a[i]<a[index])
{
swap(a[i],a[index]);
heap_adj(a,index,len);
}
}
void makeheap(int *a,int len)
{
for(int i=len/2;i>=1;i--)
heap_adj(a,i,len);
}
int main()
{
int n,k;
while(cin>>n>>k)
{
for(int i=1;i<=k;i++)
scanf("%d",&min_k[i]);
makeheap(min_k,k);
for(int i=k+1;i<=n;i++)
{
int tmp;
scanf("%d",&tmp);
if(tmp<min_k[1]){
min_k[1]=tmp;
heap_adj(min_k,1,k);
}
}
sort(min_k+1,min_k+1+k);
for(int i=1;i<k;i++) cout<<min_k[i]<<" ";
cout<<min_k[k]<<endl;
}
return 0;
}

九度OJ 题目1371:最小的K个数的更多相关文章

  1. 九度oj 题目1087:约数的个数

    题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...

  2. 九度oj题目1207:质因数的个数

    题目描述: 求正整数N(N>1)的质因数的个数. 相同的质因数需要重复计算.如120=2*2*2*3*5,共有5个质因数. 输入: 可能有多组测试数据,每组测试数据的输入是一个正整数N,(1&l ...

  3. 九度oj 题目1207:质因数的个数

    题目描述: 求正整数N(N>1)的质因数的个数. 相同的质因数需要重复计算.如120=2*2*2*3*5,共有5个质因数. 输入: 可能有多组测试数据,每组测试数据的输入是一个正整数N,(1&l ...

  4. 剑指Offer - 九度1371 - 最小的K个数

    剑指Offer - 九度1371 - 最小的K个数2013-11-23 15:45 题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是 ...

  5. hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人

    钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  6. 九度oj题目&amp;吉大考研11年机试题全解

    九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码).    http://ac.jobdu.com/problem.php?pid=11 ...

  7. 九度oj 题目1007:奥运排序问题

    九度oj 题目1007:奥运排序问题   恢复 题目描述: 按要求,给国家进行排名. 输入:                        有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号 ...

  8. 九度OJ 题目1384:二维数组中的查找

    /********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...

  9. 九度OJ 1371 最小的K个数 -- 堆排序

    题目地址:http://ac.jobdu.com/problem.php?pid=1371 题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4 ...

随机推荐

  1. python分布式抓取网页

    呵呵,前两节好像和python没多大关系..这节完全是贴代码, 这是我第一次写python,很多地方比较乱,主要就看看逻辑流程吧. 对于编码格式确实搞得我头大..取下来页面不知道是什么编码,所以先找c ...

  2. PHP MySQL Where 子句 之Where

    WHERE 子句 如需选取匹配指定条件的数据,请向 SELECT 语句添加 WHERE 子句. 语法 SELECT column FROM table WHERE column operator va ...

  3. iOS 无效的版本,提交成功,不出现版本号

    最近更新到 iOS 10,提交审核 会卡在 转菊花 ...需要更新到Xcode 8 去提交. 然后提交成功后,版本管理 新版本,构建版本 迟迟不出来.恭喜你,你的版本是无效的.请看看 你的 公司app ...

  4. 基于express框架的应用程序骨架生成器介绍

    作者:zhanhailiang 日期:2014-11-09 本文将介绍怎样使用express-generator工具高速生成基于express框架的应用程序骨架: 1. 安装express-gener ...

  5. mysql 5.7忘记密码处理

    vi /etc/my.cnf在[mysqld]下面增加一行skip-grant-tables 重启  /etc/init.d/mysqld restart /usr/local/mysql/bin/m ...

  6. Javascript进阶篇——(JS基础语法)笔记整理

    根据慕课网学习整理到一起的笔记,把东西整理到一起看起来比较方便 什么是变量字面意思:变量是可变的量:编程角度:变量是用于存储某种/某些数值的存储器.我们可以把变量看做一个盒子,盒子用来存放物品,物品可 ...

  7. Android studio教程:[2]项目整体布局

    上篇介绍了如何创建项目,这一次将介绍创建完的项目如何呈现在开发者的眼前,介绍android studio开发环境的整体布局,让大家知道各个模块的位置和功能. 工具/原料 Android studio ...

  8. 如何测试sql语句性能,提高执行效率

    有时候我们经常为我们的sql语句执行效率低下发愁,反复优化后,可还是得不到提高 那么你就用这条语句找出你sql到底是在哪里慢了 示例: SET STATISTICS io ON        SET ...

  9. EntityFramework sum嵌套

    一个查询中 用到了 sum , 可是返回结果的小数有很多位 , 都不准确了..类似js中的小数运算一样...不太熟悉C#,不知道这问题是因为double的关系 , 还是因为代码写的问题 , 通过 sq ...

  10. C++ 开源库

    1.C++各大有名库的介绍——C++标准库 2.C++各大有名库的介绍——准标准库Boost 3.C++各大有名库的介绍——GUI 4.C++各大有名库的介绍——网络通信 5.C++各大有名库的介绍— ...