数据结构实验之排序四:寻找大富翁
数据结构实验之排序四:寻找大富翁
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\n",a[i]); 54 else printf("%d ",a[i]); 55 } 56 return 0; 57 }