zoukankan      html  css  js  c++  java
  • 数据结构实验之排序四:寻找大富翁

    数据结构实验之排序四:寻找大富翁

     Code:

     1 #include <bits/stdc++.h>
     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( s<=mm/2 ){//如果是大于mm/2 就是叶子结点了,就不需要调整了
    17         //让key指向最有子树中更小的那个
    18         if( l<=mm && a[key]>a[l] ) key = l;
    19         if( r<=mm && a[key]>a[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;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<=n;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<=m;i++){
    53         if( i==m ) printf("%d
    ",a[i]);
    54         else printf("%d ",a[i]);
    55     }
    56     return 0;
    57 }
  • 相关阅读:
    JSON解析
    [Git的常见使用方式]
    [二进制]原码,反码,补码
    [伪] 级联菜单,两级菜单
    [心得]Java开发中的小心得
    [纪录]仿IOS滚轮效果(竖直滑动选择器)
    web测试总结
    科目组2
    科目组
    凭证:条目视图,总账视图
  • 原文地址:https://www.cnblogs.com/wsy107316/p/14047319.html
Copyright © 2011-2022 走看看