本題主要考察堆的性質(建堆,向堆中插入資料)。
將一系列給定數字插入乙個初始為空的小頂堆有關堆的性質和常見方法可以查閱此文。h
。隨後對任意給定的下標i
,列印從h[i]
到根結點的路徑。每組測試第1行包含2個正整數n和m(≤1000),分別是插入元素的個數、以及需要列印的路徑條數。下一行給出區間[-10000, 10000]內的n個要被插入乙個初始為空的小頂堆的整數。最後一行給出m個下標。
對輸入中給出的每個下標
i
,在一行中輸出從h[i]
到根結點的路徑上的資料。數字間以1個空格分隔,行末不得有多餘空格。5 3
46 23 26 24 10
5 4 3
24 23 10
46 23 10
26 10
仔細讀題,我一開始出錯的地方就在於認為是全部讀取完畢然後開始整理堆操作,後來發現是讀取的過程中不斷的向堆中插入資料,這是乙個自底向上的過程,也就是新插入的資料在最後,應該將其放到堆中最合適的位置(滿足最小堆的性質)即可。
所以我們應該採用 upadjust 調整,也就是:
// 向上調整堆結構的過程,我們首先確保之前 high 之前的結構已經是乙個最小頂堆
void upadjust(int low, int high) else
} }
但是對於堆來說,我們還有一種整理方式 downadjust ,向下調整,這是當我們有很多資料完全不是堆結構的時候建堆的過程。
然後讀取完畢之後的事情就很簡單了,直接一直向前回溯尋找當前結點的父親節點即可。
/*
author: veeupup
堆中的路徑
首先構建小頂堆,然後一路向前找到根結點
小頂堆的特點,當前結點的值比它的左右子樹的值大
我們先讀入乙個數列,然後進行小頂堆的調整
*/#include #include #include using namespace std;
const int maxn = 1010;
int n, m, h[maxn]; // 插入元素個數,需要列印路徑條數,小頂堆
// 向上調整堆結構的過程,我們首先確保之前 high 之前的結構已經是乙個最小頂堆
void upadjust(int low, int high) else
} }int main()
int index;
for (int i = 0; i < m; i++)
else
index = index % 2 == 0 ? index / 2 : (index - 1) / 2;
}printf("\n");
}return 0;
}
PTA 7 5 冒泡法排序
將n個整數按從小到大排序的氣泡排序法是這樣工作的 從頭到尾比較相鄰兩個元素,如果前面的元素大於其緊隨的後面元素,則交換它們。通過一遍掃瞄,則最後乙個元素必定是最大的元素。然後用同樣的方法對前n 1個元素進行第二遍掃瞄。依此類推,最後只需處理兩個元素,就完成了對n個數的排序。本題要求對任意給定的k 輸...
PTA 7 5 裝箱問題(20 分)
7 5 裝箱問題 20 分 假設有n 項物品,大小分別為s 1 s 2 s i s n 其中s i 為滿足1 s i 10 0的整數。要把這些物品裝入到容量為100的一批箱子 序號1 n 中。裝箱方法是 對每項物品,順序掃瞄箱子,把該物品放入足以能夠容下它的第乙個箱子中。請寫乙個程式模擬這種裝箱過程...
PTA 7 5 最佳情侶身高差
專家通過多組情侶研究資料發現,最佳的情侶身高差遵循著乙個公式 女方的身高 1.09 男方的身高 如果符合,你倆的身高差不管是牽手 擁抱 接吻,都是最和諧的差度。下面就請你寫個程式,為任意一位使用者計算他 她的情侶的最佳身高。輸入格式 輸入第一行給出正整數n 10 為前來查詢的使用者數。隨後n行,每行...