經典優先佇列例題整理

2021-07-15 16:50:55 字數 2159 閱讀 7538

time limit:2000ms memory limit:65536kb 64bit io format:%lld & %llu

submit

status

description

我們的小夥伴bingo真的很調皮,他在上課的路上看到樹上有個鳥窩,他就想去把他捅下來,但是鳥窩很高他夠不到,於是他就到處找木棍,想把這些木棍接在一起,然後去捅鳥窩。他一共找了n跟木棍 (1 ≤ n ≤ 20,000),每根木棍的長度為 li (1 ≤ li ≤ 50,000) 。現在他要把這n根木棍連線在一起,每次連線只能把兩根木棍連在一起,而且每連線一次都需要花費一些money去買材料,買這些材料要用的money和要連線的兩根木棍的長度之和相等(如:把長度分別為5和8的木棍連在一起,買材料就需要花13元)。bingo想要花最少的錢來買材料。我們已經知道了他找到的木棍的長度,那麼他最少要花多少錢來買材料呢??

input

第一行為bingo找到的木棍的數目n(n為整數),之後n行為每根木棍的長度。

output

bingo 所需要買材料的最少money

sample input

5 3

4 6 1 8

sample output

48hint

5 4

3 6

1 8

48 bingo第一次要把長度為1和3的木棍接在一起,需要的monye為4;

第二次要把長度為4和4的木棍接在一起,需要的money為8;

第三次要把長度為6和8的木棍接在一起,需要的money為14;

第四次要把長度為8和14的木棍接在一起,需要的money為22;

所以總共需要4+8+14+22=48;

/*

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

佛祖保佑 永無bug

*/#include

#include

#include

#include

using

namespace

std;

const

int max = 20000 +10 ;

struct st

}arr,ans;

int main()

priority_queueq;

for( int i=0; iscanf("%lld",&arr.a);

q.push(arr);

}long

long a,b,sum=0;

while( n >= 2 )

printf("%lld\n",sum);

}

一模一樣的體,上面的**不用改都能過。

【問題描述】

在乙個果園裡,多多已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。多多決定把所有的果子合成一堆。每一次合併,多多可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過n-1次合併之後,就只剩下一堆了。多多在合併果子時總共消耗的體力等於每次合併所耗體力之和。

因為還要花大力氣把這些果子搬回家,所以多多在合併果子時要盡可能地節省體力。假定每個果子重量都為1,並且已知果子的種類數和每種果子的數目,你的任務是設計出合併的次序方案,使多多耗費的體力最少,並輸出這個最小的體力耗費值。

例如有3種果子,數目依次為1,2,9。可以先將 1、2堆合併,新堆數目為3,耗費體力為3。接著,將新堆與原先的第三堆合併,又得到新的堆,數目為12,耗費體力為 12。所以多多總共耗費體力=3+12=15。可以證明15為最小的體力耗費值。

【輸入檔案】

輸入檔案fruit.in包括兩行,第一行是乙個整數n(1 <= n <= 10000),表示果子的種類數。第二行包含n個整數,用空格分隔,第i個整數ai(1 <= ai <= 20000)是第i種果子的數目。

【輸出檔案】

輸出檔案fruit.out包括一行,這一行只包含乙個整數,也就是最小的體力耗費值。輸入資料保證這個值小於231。

【樣例輸入】

3 1 2 9

【樣例輸出】

15 【資料規模】

對於30%的資料,保證有n <= 1000;

對於50%的資料,保證有n <= 5000;

對於全部的資料,保證有n <= 10000。

優先佇列例題

本文摘自部落格,歡迎前往部落格以獲得更好的體驗。有兩個長度都是 n 的序列 a 和 b 在 a 和 b 中各取乙個數相加可以得到 n 2n 2 n2個和,求這 n 2n 2 n2個和中最小的 n 個。輸入格式 第一行乙個正整數 n 第二行n個整數 a ia i ai 滿足 ai ai 1 a i l...

演算法競賽入門經典例題 優先佇列(阿格斯)

例題 阿格斯 argus 你的任務是編寫乙個稱為argus的系統。該系統是支援乙個register命令,register q num period 該命令註冊了乙個觸發器,它每秒鐘就會產生一次編號為q num的事件,你的任務是模擬出錢k個事件。如果多個事件同時發生,先處理q num小的事件 incl...

合併果子(經典優先佇列)

在乙個果園裡,多多已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。多多決定把所有的果子合成一堆。每一次合併,多多可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過 n 1次合併之後,就只剩下一堆了。多多在合併果子時總共消耗的體力等於每次合併所耗體力之和...