天梯賽L3 002 特殊堆疊(陣列模擬 二分)

2021-09-12 16:11:06 字數 1481 閱讀 7932

題目鏈結

l3-002 特殊堆疊 (30 分)

堆疊是一種經典的後進先出的線性結構,相關的操作主要有「入棧」(在堆疊頂插入乙個元素)和「出棧」(將棧頂元素返回並從堆疊中刪除)。本題要求你實現另乙個附加的操作:「取中值」——即返回所有堆疊中元素鍵值的中值。給定 n 個元素,如果 n 是偶數,則中值定義為第 n/2 小元;若是奇數,則為第 (n+1)/2 小元。

輸入的第一行是正整數 n(≤10​5​​)。隨後 n 行,每行給出一句指令,為以下 3 種之一:

push key

poppeekmedian

其中key是不超過 10​5​​ 的正整數;push表示「入棧」;pop表示「出棧」;peekmedian表示「取中值」。

對每個push操作,將key插入堆疊,無需輸出;對每個poppeekmedian操作,在一行中輸出相應的返回值。若操作非法,則對應輸出invalid

17

poppeekmedian

push 3

peekmedian

push 2

peekmedian

push 1

peekmedian

poppop

push 5

push 4

peekmedian

poppop

poppop

invalid

invalid32

2124

453invalid

【題意】

模擬棧操作,當輸入為「push」時將元素壓入棧中,當輸入為「pop」時將棧頂元素輸出,當輸入為「peekmedian」時取出棧中元素中間小的數,若棧為空輸出「invalid」。

【解題思路】

如果暴力一點就直接用vector做,每一次取數都排一次序就好了,但顯然這樣的時間複雜度肯定過不了。所以二分是個好東西。

用陣列a模擬堆疊操作,vector用來實現排序功能,當有數字加入時,二分查詢該加入vector的哪個位置,然後插入,當需要取出棧頂元素時,將陣列的指標-1,並且將棧頂元素從vector中刪除,因為vector中的元素是有序的,所以取中間值時直接取出即可。

【**】

#includeusing namespace std;

const int maxn=1e5+5;

vectorv;

vector::iterator it;

int a[maxn];

int main()

else printf("invalid\n");

}else if(str=="push")

else}}

}

天梯賽 L3 002 特殊堆疊 30 分

堆疊是一種經典的後進先出的線性結構,相關的操作主要有 入棧 在堆疊頂插入乙個元素 和 出棧 將棧頂元素返回並從堆疊中刪除 本題要求你實現另乙個附加的操作 取中值 即返回所有堆疊中元素鍵值的中值。給定 n 個元素,如果 n 是偶數,則中值定義為第 n 2 小元 若是奇數,則為第 n 1 2 小元。輸入...

L3 002 特殊堆疊

堆疊是一種經典的後進先出的線性結構,相關的操作主要有 入棧 在堆疊頂插入乙個元素 和 出棧 將棧頂元素返回並從堆疊中刪除 本題要求你實現另乙個附加的操作 取中值 即返回所有堆疊中元素鍵值的中值。給定 n 個元素,如果 n 是偶數,則中值定義為第 n 2 小元 若是奇數,則為第 n 1 2 小元。輸入...

L3 002 特殊堆疊 (30 分)

堆疊是一種經典的後進先出的線性結構,相關的操作主要有 入棧 在堆疊頂插入乙個元素 和 出棧 將棧頂元素返回並從堆疊中刪除 本題要求你實現另乙個附加的操作 取中值 即返回所有堆疊中元素鍵值的中值。給定 n 個元素,如果 n 是偶數,則中值定義為第 n 2 小元 若是奇數,則為第 n 1 2 小元。輸入...