三種基本操作:插入節點(Insert)、取最小節點(Get_Min)和刪除最小節點(Delete_Min)。
是一種最常見的優先隊列,支持優先隊列的三種基本操作,且插入節點和刪除最小節點的時間復雜度為O(logn),取最小節點的時間復雜度為O(1),效率高,過程簡單。
用途:維護貪心/DP/Dijkstra/構造…..
堆-優先隊列在STL和pb_ds庫中都有。
在一個果園里,多多已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。多多決定把所有的果子合成一堆。 每一次合并,多多可以把兩堆果子合并到一起,消耗的體力等于兩堆果子的重量之和。可以看出,所有的果子經過n-1次合并之后,就只剩下一堆了。多多在合并果子時總共消耗的體力等于每次合并所耗體力之和。 因為還要花大力氣把這些果子搬回家,所以多多在合并果子時要盡可能地節省體力。假定每個果子重量都為1,并且已知果子的種類數和每種果子的數目,你的任務是設計出合并的次序方案,使多多耗費的體力最少,并輸出這個最小的體力耗費值。 例如有3種果子,數目依次為1,2,9。可以先將1、2堆合并,新堆數目為3,耗費體力為3。接著,將新堆與原先的第三堆合并,又得到新的堆,數目為12,耗費體力為12。所以多多總共耗費體力=3+12=15。可以證明15為最小的體力耗費值。
輸入文件fruit.in包括兩行,第一行是一個整數n,表示果子的種類數。第二行包含n個整數,用空格分隔,第i個整數ai是第i種果子的數目。
輸出文件fruit.out包括一行,這一行只包含一個整數,也就是最小的體力耗費值。輸入數據保證這個值小于231。
對于30%的數據,保證有
每次取出序列中最小的兩個數,合并后放回,對合并的體力耗費值進行計數即可。這是最適合堆的場合。
panda是個數學怪人,他非常喜歡研究跟別人相反的事情。最近他正在研究篩法,眾所周知,對一個范圍內的整數,經過篩法處理以后,剩下的全部都是質數,不過panda對這些不感興趣,他只對被篩掉的數感興趣,他覺得在這些被篩掉的數中一定隱藏著重要的宇宙秘密,只是人們還沒有發現罷了。
panda還覺得如果只是單純地從小到大篩的話,還不足夠發現其中的奧秘,于是他決定對至多只包含某些質因數的數進行研究(比如說至多只包含質因數2,3的數有2,3,4,6,8,9,……),他需要得到這些數中第k小的數(k是panda認為的宇宙系數),請你編個程序,幫助他找到這個數。
第1行有2個數n,k,n代表質因數的個數,k代表那個宇宙系數(
第2行有n個數,代表這n個質因數。(每個均小于1000,且不相同)
僅1行,即至多只包含這n個質因數的數中第k小的數。 (這個數不會超過2000000000)
這題若是當單純的堆,只能拿90分。現在想來,其實應該配合亂搞,比如一邊入一邊出,否則那么龐大的可能數,的確維護很煩。
優先隊列優化DP,其他好像真的不太考。
新聞熱點
疑難解答