H StarCraft (哈夫曼樹思想)
題意:
給你n個建築和他們所需的建築時間。
初始給你m個人,有兩個用途。
1.去建建築,花費他們所需的時間,然後死亡。
2.去分裂成2個人,需要k個時間,然後死亡。
問你建完所有建築需要的最短時間。
POINT:
首先要知道的是,如果n>m時,我們恰好造出n個人是最優的。
把人的關係想象成 多顆二叉樹,每個葉子節點就是去建築的人。
如果多生了的話 , 這個多生了的數量 肯定能被二進位制表示。
能被二進位制表示說明就能被二叉樹表示
就是在那棵二叉樹裡剪掉 一顆或者多棵二叉樹 剪掉的之後的根就可以利用來造建築
所以不存在什麼,分裂時間很短,我先分裂多一點,再去建築。沒有這種情況。
所以問題就相當於,有n個點,要把它兩兩合併成m個點。
即類似哈夫曼樹,這次只不過是森林。
怎麼合併:
把最小時間和次小時間拿出來。 次小時間+k再加入佇列。 (因為(最小+k)<(次小+k))所以(最小+k)被無視了,他肯定不是答案。
#include <iostream> #include <stdio.h> #include <algorithm> #include <string.h> #include <queue> using namespace std; const int maxn = 100000+23; priority_queue<int,vector<int>,greater<int> > q; int main() { int T; scanf("%d",&T); while(T--){ int n,m,k; scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=n;i++){ int x;scanf("%d",&x); q.push(x); } while(n>m){ q.pop(); int a=q.top(); q.pop(); q.push(a+k); n--; } while(q.size()!=1) q.pop(); printf("%d\n",q.top()); q.pop(); } }
相關推薦
H StarCraft (哈夫曼樹思想)
題目題意:給你n個建築和他們所需的建築時間。初始給你m個人,有兩個用途。1.去建建築,花費他們所需的時間,然後死亡。2.去分裂成2個人,需要k個時間,然後死亡。問你建完所有建築需要的最短時間。POINT:首先要知道的是,如果n>m時,我們恰好造出n個人是最優的。把人的關
4198: [Noi2015]荷馬史詩 (哈夫曼樹基礎)
如何選擇 是否 scrip print for scanf 表示 stat tor 一、題目概述 4198: [Noi2015]荷馬史詩 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1545 Solved: 818[Su
Greedy——HDUOJ 1553 - Entropy(哈夫曼樹求解)
原題: Problem Description 哈夫曼解釋……..(內容過多) Sample Input AAAAABCD THE_CAT_IN_THE_HAT END Sample Output
Fence Repair(哈夫曼樹+優先佇列)
D - Fence Repair Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status Practice POJ 3253 u
小專案-檔案壓縮(哈夫曼樹)
先回顧一下哈夫曼樹 huffman樹即最優二叉樹,是加權路徑長度最短的二叉樹。哈夫曼樹的樹使用貪心演算法。 每次選擇該集合中權值最小的兩個作為葉子結點,父親節點的權值為葉子節點權值之和。然後又將其父親重新放進此集合裡。重複前面的做法,直到完成哈夫曼樹的建
資料結構與演算法 -- 哈夫曼樹思想與建立詳解1
PS:什麼是哈夫曼樹? 給定n個權值作為n個葉子結點,構造一棵二叉樹,若該樹的帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹(Huffman Tree)。哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。 計算規則: 假設一組權值,一個權值是一個結點,12 &
ZOJ 1117 Entropy(哈夫曼樹)
Entropy Time Limit: 2 Seconds Memory Limit: 65536 KB Background An entropy encoder is a data encoding method that achieves lossles
資料結構之二叉樹應用(哈夫曼樹及哈夫曼編碼實現)(C++)
一、哈夫曼樹1.書上用的是靜態連結串列實現,本文中的哈夫曼樹用 排序連結串列 實現;2.實現了從 字元頻率統計、構建權值集合、建立哈夫曼樹、生成哈夫曼編碼,最後對 給定字串的編碼、解碼功能。3.使用到的 “SortedList.h”標頭檔案,在上篇博文:資料結構之排序單鏈表。
最優二叉樹(哈夫曼樹)知識點
路徑:在一棵樹中從一個結點往下到孩子或孫子結點之間的通路 結點的路徑長度:從根節點到該節點的路徑上分支的數目 樹的路徑長度:樹中每個結點的路徑長度之和 結點的權:給樹中的結點賦予一個某種含義的值,則該
電文的編碼和譯碼(哈夫曼樹的應用)
一、 實驗環境學寶虛擬機器,VC6.0二、 實驗目的從鍵盤接收一串電文字元,輸出對應的哈夫曼編碼,同時能翻譯哈夫曼編碼生成的程式碼串,輸出對應的電文字元。三、 實驗內容1.用C語言實現二叉樹的鏈式(二叉連結串列)儲存結構;2.實現二叉
hdu1053 Entropy(哈夫曼樹)
複習了一天哈夫曼樹。。。 去年只是學了哈夫曼的構建,但不懂這樹的含義,今天想了好久,真的好厲害一棵樹啊! 一個普通的字串,竟然可以轉變為帶權值的樹。我許久不能理解的是為什麼字元出現次數可以用權值來表達
Entropy (哈夫曼樹)
題目連結 思路 程式碼 思路 純資料結構。 程式碼 #include <iostream> #include <cstdio> #include &l
Java 樹結構實際應用 二(哈夫曼樹和哈夫曼編碼)
赫夫曼樹 1 基本介紹 1) 給定 n 個權值作為 n 個葉子結點,構造一棵二叉樹,若該樹的帶權路徑長度(wpl)達到最小,稱這樣的二叉樹為 最優二叉樹,也稱為哈夫曼樹(Huffman Tree), 還有的書翻譯為霍夫曼樹。 2) 赫夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近  
轉載:哈夫曼樹的構造和哈夫曼編碼(C++代碼實現)
作者 pos blank 字符 element start man null == 作者:qiqifanqi 原文:http://blog.csdn.net/qiqifanqi/article/details/6038822 #include<stdio.h>
哈夫曼樹(C++優先隊列的使用)
name sub pan main 道理 輸出 tor 數據 排序。 給定n個權值作為n個葉子結點,構造一棵二叉樹,若帶權路徑長度達到最小,稱為哈夫曼樹(Huffman Tree)。哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。 構造 假設有n個權
文件壓縮——哈夫曼樹編碼(一)
結構體 splay 空間 構建 葉子 ESS rate char 底層 何謂哈夫曼樹?—— 百度百科:給定n個權值作為n個葉子結點,構造一棵二叉樹,若帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹(Huffman Tree)。哈夫曼樹是帶權路徑長度最短
哈夫曼樹(優先佇列實現)
#include<iostream> #include<cstdio> #include<queue> using namespace std; int main(){ int t; cin>>t; while(t--)
哈夫曼樹詳細講解(帶例題和C語言程式碼實現——全註釋)
** 哈夫曼樹詳細講解(帶例題和C語言程式碼實現——全註釋) ** 定義 哈夫曼樹又稱最優二叉樹,是一種帶權路徑長度最短的二叉樹。所謂樹的帶權路徑長度,就是樹中所有的葉結點的權值乘上其到根結點的 路徑長度(若根結點為0層,葉結點到根結點的路徑長度為葉結點
資料結構——哈夫曼樹的實現以及編碼(C語言實現)
1、問題描述 利用哈夫曼編碼進行通訊可以大大提高通道利用率,縮簡訊息傳輸時間,降低傳輸成本。構造哈夫曼樹時,首先將由n個字 符形成的n個葉子結點存放到陣列HuffNode的前n個分量中,然後根據哈夫曼方法的基本思想,不斷將兩個較小的子樹合併為一個
Huffman(哈夫曼)樹編碼與解碼程式(全)
關於Huffman樹構建與編碼的原理,很多書上有介紹,我在這裡就只給出相應的程式,包括樹的構建,2種編碼方法,譯碼(這部分是我自己獨立寫的,肯定有不當之處,歡迎回帖指正)等,裡面註釋也很清晰,費了很大勁,希望對大家有幫助。 <span style="font-siz