2.codeup-堆-合并果子(堆)

120 阅读1分钟

思路

  • 用堆排序输出序列中两个最小的数,相加后重新插入堆中,形成新堆。并用ans记录相加的结果。

反思

  • !!堆可以作为一种动态的排序算法,一边输出一边排序。

代码

#include<algorithm>
using namespace std;
const int maxn=30001;
int heap[maxn];
int n;

void downAdujust(int low,int high){
	int i=low,j=2*i;
	while(j<=high){
		if(j+1<=high&&heap[j+1]<heap[j]) j++;
		if(heap[i]<=heap[j]) break;
		swap(heap[i],heap[j]);
		i=j;
		j=2*i;
	}	
}

void createHeap(){
	for(int i=n/2;i>0;i--){
		downAdujust(i,n);
	}
}


int main(){
	while(scanf("%d",&n)!=EOF){
		for(int i=1;i<=n;i++){
			scanf("%d",&heap[i]);
		}
		createHeap();
		int temp;
		int ans=0;
		for(int i=n;i>1;i--){
			temp=heap[1];
			heap[1]=heap[i];
			downAdujust(1,i-1);
			temp+=heap[1];
			heap[1]=temp;
			ans+=heap[1]; 
			downAdujust(1,i-1);
		}
		printf("%d\n",ans);		
	}
	return 0;
}