重編碼(priority_queue)有一篇文章,文章包含 n種單詞,單詞的編號從 1 至 n,第 i 種單詞的出現次數為 w[i]。
現在,我們要用乙個 2 進製串(即只包含 0 或 1 的串) s[i] 來替換第 i 種單詞,使其滿足如下要求:對於任意的 1≤i,j≤n(i≤j),都有 s[i] 不是 s[j] 的字首。(這個要求是為了避免二義性)
你的任務是對每個單詞選擇合適的 s[i],使得替換後的文章總長度(定義為所有單詞出現次數與替換它的二進位制串的長度乘積的總和)最小。求這個最小長度。
字串 s1(不妨假設長度為 n)被稱為字串 s2 的字首,當且僅當:s2 的長度不小於 n,且 s1 與 s2 前 n 個字元組組成的字串完全相同。
第一行乙個整數 n,表示單詞種數。(0第 2 行到第 n+1 行,第 i+1 行包含乙個正整數 w[i],表示第 i 種單詞的出現次數m。(1輸出一行乙個整數,表示整篇文章重編碼後的最短長度。
411
22
12
一種最優方案是令 s[1]=000,s[2]=001,s[3]=01,s[4]=1。這樣文章總長即為 3*1+3*1+2*2+1*2=12。
複雜度o(nlogn)
#include
#include
#include
#include
typedef
long
long ll;
using namespace std;
intmain()
while
(pq.
size()
!=1) sum +
= num;
pq.push
(num);}
cout
}
清華大學演算法訓練營 等式
時間限制 2s,空間256mb 問題描述 n個變數和m個 相等 或 不相等 的約束條件,請你判定是否存在一種賦值方案滿足所有m個約束條件。輸入第一行乙個整數t,表示資料組數。t 100 接下來會有t組資料,對於每組資料 第一行是兩個整數n,m,表示變數個數和約束條件的個數。1 n,m 500000 ...
清華大學演算法訓練營 象棋
你有足夠多的象棋 車 在乙個n n的棋盤上你能放多少個 車 呢?注意,所給棋盤上有些位置不能放任何東西。同時,某一行 列 最多只能存在乙個 車 第一行為乙個正整數n。1 n 500 接下來n行,每行包含n個整數,若為0表示這個位置不能放 車 若為1表示這個位置可以放 車 輸出乙個整數,表示最多能放多...
清華大學演算法訓練營 序列計數
給定乙個n個整數的序列以及乙個非負整數d,請你輸出這個序列中有多少個連續子串行 長度大於1 滿足該子串行的最大值最小值之差不大於d。如 序列1 2 3中長度大於1的連續子串行有 1 2 2 31 2 3第一行包含兩個整數n,d。1 n 300000,0 d 2000000000 接下來一行包含n個整...