数据结构实验之排序四:寻找大富翁
标签:oid img 排序 技术 元素 tle 堆排 维护 loading
数据结构实验之排序四:寻找大富翁
Code:
1 #include 2 using namespace std;
3 const int maxn = 1010;
4 const int minn = -10001;
5
6 int a[25];
7 int n,m;
8
9 //堆排序是倒序的
10 //所以要找前m大的要维护小顶堆
11
12 void HeapAdjust(int s,int mm){
13 int key = s;
14 int l = s*2;
15 int r = s*2+1;
16 if( s2 ){//如果是大于mm/2 就是叶子结点了,就不需要调整了
17 //让key指向最有子树中更小的那个
18 if( la[l] ) key = l;
19 if( ra[r] ) key = r;
20 if( key!=s ){
21 int t = a[key];
22 a[key] = a[s];
23 a[s] = t;
24 HeapAdjust(key,mm);
25 }
26 }
27 }
28
29 int main()
30 {
31 scanf("%d%d",&n,&m);
32 for(int i=1;i//注意这里现在只存了m个数,维护了一个m个节点的堆,如果是n个节点然后去调整的话就会TLE
33 scanf("%d",&a[i]);
34 }
35 for(int i=m/2;i>0;i--){
36 HeapAdjust(i,m);
37 }
38 for(int i=m+1;i){
39 int x; scanf("%d",&x);
40 if( x>a[1] ){//如果说前维护的这m个元素中的最小的那个元素比当前输入的这个小的话,那么就可以直接删除了,因为他肯定不是前m大的了,然后调整小顶堆维护前m个中的最小值
41 a[1] = x;
42 HeapAdjust(1,m);
43 }
44 }
45 for(int i=m;i>0;i--){//调整,使得从大到小排
46 int t = a[1];
47 a[1] = a[i];
48 a[i] = t;
49 HeapAdjust(1,i-1);
50 }
51
52 for(int i=1;i){
53 if( i==m ) printf("%d\n",a[i]);
54 else printf("%d ",a[i]);
55 }
56 return 0;
57 }
数据结构实验之排序四:寻找大富翁
标签:oid img 排序 技术 元素 tle 堆排 维护 loading
原文地址:https://www.cnblogs.com/wsy107316/p/14047319.html
评论