我發現自己有乙個賤毛病,學習之前喜歡先抒情或者表達一些什麼特別的感情,之後再開始學習,玩的時候倒是很快能夠進入狀態,比如說今天的感慨就是:
不管學習什麼都要對自己有耐心,學習一點是一點,不浮不躁。好了,我說完了,開始進入今天的正式內容。
重編碼問題
重編碼
問題描述
有一篇文章,文章包含 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 思路一:暴力方法,構建哈夫曼樹,逐個節點構建(程式貌似沒法正確執行,不過我先貼出來了,作為乙個思路)
思路二:採用棧和佇列兩種資料結構///完整版本的程式
#include
#include
#include
using
namespace
std;
long
long getanswer(int n,vector
long> w);
int main()
sort(w.begin(),w.end());
//print("%lld\n",getanswer(n,w));
cout
//返回的是乙個數值
long
long getanswer(int n,vector
long> w)
} ///
//如果大於所有的,就補充在最後
if(flag==0)
w.insert(w.end(),sum);//在最後插入元素 }}
//insert 表示在指定位置(loc)表示迭代器,之前插入元素
思路三:採用優先順序佇列(priority queue)#include
#include
using
namespace
std;
int main()
//對向量進行排序
sort(v.begin(),v.end());
reverse(v.begin(),v.end());
stack
s;queue
q;//初始化兩個資料結構
//將已經有順序的向量入棧,逆著順序,在棧裡面從上到下是逐漸增加
for(vector
::iterator it =v.begin();it!=v.end();it++)
int sum=0,count=0;//表示最小的兩個數的加和
int max=1000000;//表示乙個很大的數值
int s_a,s_b,q_a,q_b;
if(s.size()==0)
cout
<<"一派胡言!";
if(s.size()==1)
count=s.top();
else
else
s_a=max;
s_b=max;
///同理對於佇列而言
if(q.size()>0)
else
q_a=max;
q_b=max;
//找出四個數之中最小的兩個數值
if(s_aif(!s.empty())
s_b=s.top();
else
s_b=max;
if(s_belse
} else
}
count+=sum;
q.push(sum);}}
cout
<<"count:"
}
//使用優先順序佇列重編碼
#include
using
namespace
std;
int main()
sort(v.begin(),v.end());
for(vector
long>::iterator it=v.begin();it!=v.end();it++)
/*while(!pq.empty())
cout
<<"count:"
0;}
Dijkstra演算法 例題
dijkstra演算法 從起點到終點求最短路 使用要求權值為正 1 求短路i 題目 點數 500 邊數 1e5 include include include using namespace std const int n 510,m 1e5 10 時間複雜度o n m int n,m 鄰接矩陣 i...
模擬演算法例題
一 火柴棒 題目描述 給你n根火柴棍,你可以拼出多少個形如 a b c 的等式?等式中的a b c是用火柴棍拼出的整數 若該數非零,則最高位不能是0 用火柴棍拼數字0 9的拼法如圖所示 注意 1 加號與等號各自需要兩根火柴棍 2 如果a b,則a b c與b a c視為不同的等式 a b c 0 3...
manacher演算法 例題
簡單而有通俗的講解,講的太好了 證明對於一些我的理解,我會以 注釋的形式寫在 裡,我不懶 char str maxn char temp maxn 1 10 擴充套件後的字串 int len maxn 1 10 擴充套件後字串第i個位置回文串從中間到第有邊界的長度 相當於 回文子串長度 2 1 在用...