[九度OJ]1431.Sort(寻找前m大数并排序)
原题链接:http://ac.jobdu.com/problem.php?pid=1431
- 题目描述:
-
给你n个整数,请按从大到小的顺序输出其中前m大的数。
- 输入:
-
每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行包含n个各不相同,且都处于区间[-500000,500000]的整数。
- 输出:
-
对每组测试数据按从大到小的顺序输出前m大的数。
- 样例输入:
-
5 3
3 -35 92 213 -644
- 样例输出:
-
213 92 3
题解:
寻找前m大数与寻找第m大数是同一问题,直接对n个数排序肯定是会超时的,这类问题有很多解法,本题采用小顶堆完成。小顶堆的堆顶元素就是最大m个元素中最小的一个。初始可以将每个值设得尽可能小(比n个数的任何数都小),然后每次考虑一个数X,如果X比堆顶元素小,则不需要改变原来的堆,如果X比堆顶元素大,则需要用X替换堆顶元素,并同时调整堆结构。这个调整的过程的时间复杂度为O(log2m)。
#include <cstdio>
#include <stdlib.h>
#include <algorithm>
using namespace std; int n,m;
int arr[];
int heap[]; bool cmp(int a,int b)
{
if(a>b)
return true;
else
return false;
}
int main()
{
freopen("sort.in","r",stdin);
freopen("sort.out","w",stdout);
int p,q;
while(scanf("%d %d",&n,&m)!=EOF)
{
for(int i=; i<m; i++)
heap[i] = -; for(int i=; i<n; i++)
{
scanf("%d",&arr[i]);
if(arr[i]>heap[])
{
heap[] = arr[i];
p = ;
while(p<m)
{
q = *p +;
if(q >= m)
break;
if((q<m-) && (heap[q+]<heap[q]))
q =q+;
if(heap[q]<heap[p])
{
swap(heap[p],heap[q]);
p = q;
}
else
break;
}
}
} sort(heap,heap+m,cmp);
for(int i=; i<m; i++){
printf("%d",heap[i]);
if(i<m-)
printf(" ");
}
printf("\n");
}
return ;
}
[九度OJ]1431.Sort(寻找前m大数并排序)的更多相关文章
- 九度OJ 1337:寻找最长合法括号序列 (DP)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:839 解决:179 题目描述: 给你一个长度为N的,由'('和')'组成的括号序列,你能找出这个序列中最长的合法括号子序列么?合法括号序列的 ...
- 九度OJ 1034:寻找大富翁 (排序)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5925 解决:2375 题目描述: 浙江桐乡乌镇共有n个人,请找出该镇上的前m个大富翁. 输入: 输入包含多组测试用例. ...
- 九度OJ 1342:寻找最长合法括号序列II (DP)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:898 解决:366 题目描述: 假如给你一个由'('和')'组成的一个随机的括号序列,当然,这个括号序列肯定不能保证是左右括号匹配的,所以给 ...
- 九度OJ 1261:寻找峰值点 (基础题)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:500 解决:37 题目描述: 给定一个整数序列,该整数序列存在着这几种可能:先递增后递减.先递减后递增.全递减.全递增. 请找出那个最大值的 ...
- 九度OJ 1174:查找第K小数 (排序、查找)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6376 解决:2539 题目描述: 查找一个数组的第K小的数,注意同样大小算一样大. 如 2 1 3 4 5 2 第三小数为3. 输入: ...
- 九度OJ 1013:开门人和关门人 (排序)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5052 解决:2563 题目描述: 每天第一个到机房的人要把门打开,最后一个离开的人要把门关好.现有一堆杂乱的机房签到.签离记录,请 ...
- 九度OJ 1129:Skew数 (大数运算)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:734 解决:548 题目描述: 在 skew binary表示中, 第 k 位的值xk表示xk*(2k+1-1). 每个位上的可能数字是0 ...
- 九度OJ 1198:a+b (大数运算)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6745 解决:2320 题目描述: 实现一个加法器,使其能够输出a+b的值. 输入: 输入包括两个数a和b,其中a和b的位数不超过1000位 ...
- 九度OJ 1181:遍历链表 (链表、排序)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2733 解决:1181 题目描述: 建立一个升序链表并遍历输出. 输入: 输入的每个案例中第一行包括1个整数:n(1<=n<=1 ...
随机推荐
- NOSQL之【WIN7的安装配置】
1.下载安装 大家根据各自系统配置,下载相对应的redis版本.我下载是redis 2.6 将redis.conf 复制到 bin/release/redisbin 里面 redis-server.e ...
- MongoDB入门三步曲3--部署技术:主备、副本集和数据分片
mongodb部署--主备.副本及数据分片 主备复制 副本集 数据分片 主备复制 主备复制是最基本的一种多点部署方案,在读写分离.热备份.数据恢复等方面具有重要作用. 在真实的生产环境,主备库肯定需要 ...
- php 删除文件夹及文件
<?php function deleteDir($dir) { if (!$handle = @opendir($dir)) { return false; } while (false != ...
- 【10】了解Bootstrap栅格系统基础案例(5)
这次我们来说下列排序: 通过使用 .col-md-push-* 和 .col-md-pull-* 类就可以很容易的改变列(column)的顺序. <!DOCTYPE html> <h ...
- TypeScript学习指南--目录索引
关于TypeScript: TypeScript是一种由微软开发的自由和开源的编程语言.它是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程. TypeS ...
- Pair Project: Elevator Scheduler [电梯调度算法的实现和测试]:谢勤政-11061197,吴润凡-11061185
一,关于结对编程 结对编程的优点: 1)在开发层次,结对编程能提供更好的设计质量和代码质量,两人合作能有更强的解决问题的能力. 2)对开发人员自身来说,结对工作能带来更多的信心,高质量的产出能带来更高 ...
- 学无止境,学习AJAX(二)
POST 请求 一个简单 POST 请求: xmlhttp.open("POST","demo_post.asp",true); xmlhttp.send(); ...
- 关于c++字符串的while(*temp++)
首先,上一段代码 static bool reverse_str(const char *str) { const char *temp=str; while(*temp++); temp-=; // ...
- hdu 4267
一个很不错的题: 刚刚看到这个题目就感觉要用线段树或者树状数组,但是有感觉有点不同: 敲了一发简单的线段树之后果断的T了: 网上一搜题解,发现要用55颗线段树或者树状数组: 一共有k种树,然后每种树根 ...
- 网站报错Access denied for user 'root'@'localhost' -问题排查续
网站报错Access denied for user 'root'@'localhost' (using password: YES) 每次的挽救办法就是: /etc/init.d/mysqld st ...