1. 程式人生 > >H StarCraft (哈夫曼樹思想)

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