数据结构实验之排序四:寻找大富翁
来源:互联网 发布:linux线程间通信方式 编辑:程序博客网 时间:2024/06/06 04:03
Problem Description
2015胡润全球财富榜调查显示,个人资产在1000万以上的高净值人群达到200万人,假设给出N个人的个人资产值,请你快速找出排前M位的大富翁。
Input
首先输入两个正整数N( N ≤ 10^6)和M(M ≤ 10),其中N为总人数,M为需要找出的大富翁数目,接下来给出N个人的个人资产,以万元为单位,个人资产数字为正整数,数字间以空格分隔。
Output
一行数据,按降序输出资产排前M位的大富翁的个人资产值,数字间以空格分隔,行末不得有多余空格。
Example Input
6 3
12 6 56 23 188 60
Example Output
188 60 56
Hint
请用堆排序完成。
本题时间和空间要求都很高,数据也比较大,所以用堆排,需要求n个人中的m个人,就建一个能存m个数据的最小堆,
然后用剩余的n-m个数据与堆顶元素比较,如果当前元素比堆顶元素小,就continue,若比堆顶元素大,舍弃当前堆顶而将这个数作为新堆顶
最后,最小堆里的元素就是n个数中前m个最大的数;
求前k个最大的数则建立k个数的最小堆
求前k个最小的数则建立k个数的最大堆
#include <iostream>#include <stdio.h>using namespace std;int a[20];//空间能够存m个即可void heapjust(int s, int m)//把a[]建成小堆顶{ int t; t = a[s];//堆顶元素 for(int i = 2*s; i <= m; i*=2) { if(i < m && a[i] > a[i+1])//找左右孩子中较大的一个 i++; if(t < a[i]) break; a[s] = a[i]; s = i; } a[s] = t;}int main(){ int n, m, i, x; scanf("%d %d", &n, &m); for(int i = 1; i <= m; i++) { scanf("%d",&a[i]); } for(i = m/2; i > 0; i--) { heapjust(i, m);//建造m个元素的小堆顶 } for(i = m+1; i <= n; i++) { scanf("%d", &x); if(x > a[1])//随时替换小堆顶的根元素 { a[1] = x;//更新小堆顶 heapjust(1, m);//重新将替根元素后的堆调成小堆顶 } } for(i = m; i > 1; i--)//将堆顶元素和当前未经排序子序列的最后一个元素交换 { swap(a[1], a[i]); heapjust(1, i-1);//重复建小顶堆 } for(i = 1; i <= m; i++) { if(i == 1) printf("%d", a[i]); else printf(" %d", a[i]); } printf("\n");}
用数组来仿堆
#include <iostream>#include <stdio.h>#include <algorithm>using namespace std;int a[20];int main(){ ios::sync_with_stdio(false);//加速 int n, m, x; cin>>n>>m; for(int i = 0; i < m; i++) { cin>>a[i];//将m个元素存入数组里,假设它们是最大值 } for(int i = m; i < n; i++) { cin>>x; sort(a, a+m);//把之前的m个元素从小到大排序,所以最小值肯定存在a[0] if(x > a[0]) { a[0] = x; } } sort(a, a+m);//将“堆”sort排序,从小到大的 for(int i = m-1; i >= 0; i--) { if(i == m-1) cout<<a[i]; else cout<<" "<<a[i]; } cout<<endl; return 0;}
阅读全文
0 0
- 数据结构实验之排序四:寻找大富翁
- 数据结构实验之排序四:寻找大富翁
- 数据结构实验之排序四:寻找大富翁
- 数据结构实验之排序四:寻找大富翁
- 数据结构实验之排序四:寻找大富翁
- 数据结构实验之排序四:寻找大富翁
- 数据结构实验之排序四:寻找大富翁
- 数据结构实验之排序四:寻找大富翁
- 数据结构实验之排序四:寻找大富翁
- 数据结构实验之排序四:寻找大富翁
- 数据结构实验之排序四:寻找大富翁
- 数据结构实验之排序四:寻找大富翁
- 数据结构实验之排序四:寻找大富翁
- 数据结构实验之排序四:寻找大富翁
- 数据结构实验之排序四:寻找大富翁
- 数据结构实验之排序四:寻找大富翁
- 数据结构实验之排序四:寻找大富翁
- 数据结构实验之排序四:寻找大富翁
- RevitAPI之关于删除元素后
- 【数据库课程】研讨02
- C/C++ IDE
- Android MarginLeft与MarginStart的区别
- Spring Boot 启动自定义图
- 数据结构实验之排序四:寻找大富翁
- Codeup1085: 阶乘的和
- laravel中将查询的对象转换为多维数组的函数
- MySQL数据库备份和恢复方案小结
- SQLServer 每隔10分钟取一条数据
- BottomTabBar
- maven 入门详解
- CSMA/CD
- 2017.12.16【NOIP提高组】模拟赛B组