原題鏈接
解題思路
一定要認認真真看輸入輸出樣例,確保和自己想象中的一致,包括順序啊格式啊,不然很可能做到最後才發現理解錯了意思。
有了這個好習慣之後(之前經常看個大概題目就去做然後提交才發現理解錯了):
一看題目想當然的認爲是假定輸入元素是按照完全二叉樹結構擺放的,再從最後一個非葉子結點開始向下調整得到最小堆,但是發現和輸出樣例不一致。
然後再重新看題,發現說了是將給定元素依次插入堆(初始爲空)中。
那麼就只要實現堆的插入就好了,插入時追加到堆數組的最後,然後向上調整即可。
源代碼
#include<iostream>
using namespace std;
const int maxn = 1010;
int heap[maxn], n = 0;
void upAdjust(int low, int high){
int i = high, j = i/2;
int x = heap[high];//先保存下來
//給x找一個合適的位置i
while(j >= low){
if(x < heap[j]){//注意不是拿heap[i]和heap[j]比較
heap[i] = heap[j];
i = j;
j /= 2;
}
else
break;
}
heap[i] = x;
}
void insert(int i){
n++;//堆個數加1
heap[n] = i;//追加到末尾
upAdjust(1, n);//向上調整到合適的位置
}
void printPath(int pos){
while(pos >= 1){
printf("%d", heap[pos]);
if(pos != 1)//不多輸出空格
printf(" ");
pos /= 2;
}
}
int main(){
int num, m;
scanf("%d%d", &num, &m);
int data;
for(int i=1; i<=num; i++){
scanf("%d", &data);
insert(data);
}
int pos;
for(int i=0; i<m; i++){
scanf("%d", &pos);
printPath(pos);
if(i!=m-1)//不多輸出換行符
printf("\n");
}
return 0;
}