思路
- 用堆排序输出序列中两个最小的数,相加后重新插入堆中,形成新堆。并用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;
}