重編碼

問題描述

有一篇文章,文章包含 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,表示單詞種數。

第 2 行到第 n+1 行,第 i+1 行包含一個正整數 w[i],表示第 i 種單詞的出現次數。

輸出格式

輸出一行一個整數,表示整篇文章重編碼後的最短長度。

樣例輸入
4
1
1
2
2

樣例輸出
12

樣例解釋

一種最優方案是令s[1]=000,s[2]=001,s[3]=01,s[4]=1。這樣文章總長即爲 1*3+1*3+2*2+1*2=12。
另一種最優方案是令s[1]=00,s[2]=01,s[3]=10,s[4]=11。這樣文章總長也爲 12。
數據範圍

對於第 1 個測試點,保證 n=3。
對於第 2 個測試點,保證 n=5。
對於第 3 個測試點,保證 n=16,且所有 w[i] 都相等。
對於第 4 個測試點,保證 n=1,000。
對於第 5 個測試點,保證所有 w[i] 都相等。
對於所有的 7 個測試點,保證 2≤n≤100,000,w[i]≤10^11。
時間限制:2 sec
空間限制:256 MB

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章