優先取最小的,因為最先取得加的次數最多
並且 每次最好就合併k個,那麼這種情況時,n=1+(k-1)*m, m∈n
所以(n-1)%(m-1)不為0時,要先取掉 前(n-1)%(m-1)+1個,這樣可以讓後面比較大的數字合併次數減少
一開始用set做哈夫曼樹 但會超時
所以用兩個雙端佇列,乙個儲存原來的值,乙個儲存合併後的值
#include#include#include#include#includeusing namespace std;
const int maxn=100000+5;
typedef long long ll;
ll a[maxn],n,t;
dequeq1,q2;
ll get()
else if(q2.empty())
else
else
} return temp;
}bool bempty()
bool check(int k)
return true;
}int binarysearch()
{ if(n==0) return 0;
int l=1,r=n,mid;
while(l
兩個佇列 k叉哈夫曼樹 HDU 5884
1 兩個佇列 k叉哈夫曼樹 hdu 58842 camp題解 3 題意 nn個有序序列的歸併排序.每次可以選擇不超過kk個序列進行合併,合併代價為這些序列的長度和.總的合併代價不能超過tt,問kk最小是多少。4 5 題解 首先二分一下這個kk。然後在給定kk的情況下,這個代價其實就是kk叉的哈夫曼樹...
Sort HDU 5884 二分 哈夫曼樹
題目連線 題意 給你n個序列,將其合併為乙個,每次合併的花費為合併序列的長度的加和,先給你總花費t,保證在花費不超過t的基礎上,求每次最少需要合併幾個序列。做題的時候雖然只是想到了二分 哈夫曼樹,可是由於陣列開小了,導致一直wa,最後發現了,改掉陣列之後,立馬超時 哈哈哈,果然純2分 優先佇列是不行...
K叉哈夫曼樹
哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。哈夫曼樹的構造方法是貪心的每次選最小的幾個節點構造。當k 2k 2 k 2的時候需要預處理一下,因為可能最後一步合併操作的點數不到k個節點,這樣的話就不是最優的了。k 2k 2 k 2預處理方法 當r em ain n 1 mod k 1 0r...