問題描述 Huffman樹在編碼中有著廣泛的應用。在這里,我們只關心Huffman樹的構造過程。 給出一列數{pi}={p0, p1, …, pn-1},用這列數構造Huffman樹的過程如下: 1. 找到{pi}中最小的兩個數,設為pa和pb,將pa和pb從{pi}中刪除掉,然后將它們的和加入到{pi}中。這個過程的費用記為pa + pb。 2. 重復步驟1,直到{pi}中只剩下一個數。 在上面的操作過程中,把所有的費用相加,就得到了構造Huffman樹的總費用。 本題任務:對于給定的一個數列,現在請你求出用該數列構造Huffman樹的總費用。
例如,對于數列{pi}={5, 3, 8, 2, 9},Huffman樹的構造過程如下: 1. 找到{5, 3, 8, 2, 9}中最小的兩個數,分別是2和3,從{pi}中刪除它們并將和5加入,得到{5, 8, 9, 5},費用為5。 2. 找到{5, 8, 9, 5}中最小的兩個數,分別是5和5,從{pi}中刪除它們并將和10加入,得到{8, 9, 10},費用為10。 3. 找到{8, 9, 10}中最小的兩個數,分別是8和9,從{pi}中刪除它們并將和17加入,得到{10, 17},費用為17。 4. 找到{10, 17}中最小的兩個數,分別是10和17,從{pi}中刪除它們并將和27加入,得到{27},費用為27。 5. 現在,數列中只剩下一個數27,構造過程結束,總費用為5+10+17+27=59。 輸入格式 輸入的第一行包含一個正整數n(n<=100)。 接下來是n個正整數,表示p0, p1, …, pn-1,每個數不超過1000。 輸出格式 輸出用這些數構造Huffman樹的總費用。 樣例輸入 5 5 3 8 2 9 樣例輸出 59
/*求解此題需要一個排序算法,采用效率較低的冒泡了,每次合并兩個數據時便會加入一個新的數據到數組中,不知道新加入的是不是最小的,因此排序好的數組需要更新,直到這個數組中只有一個元素了。*/ #include<stdio.h>int main(){ int n,Huff[100],i,j,count,cost=0,sum=0; scanf("%d",&n); count=n; for(i=0;i<n;i++) scanf("%d",&Huff[i]); for(i=0;i<n-1;i++) for(j=0;j<n-1-i;j++) if(Huff[j]>Huff[j+1]) {int temp=Huff[j];Huff[j]=Huff[j+1];Huff[j+1]=temp;}//冒泡排序將原始數據排序 while(count>=2){//當原始數組中不止一個元素時繼續循環 cost=Huff[0]+Huff[1];//表示每次的花費 for(i=0;i<=count-1;i++) Huff[i-1]=Huff[i];//數組中每個元素都前移,將第一個覆蓋掉。 Huff[0]=cost;//加入合并后的新元素 sum+=cost;//累計花費 count--;//數組中現有元素自減一 for(i=0;i<count-1;i++) for(j=0;j<count-1-i;j++) if(Huff[j]>Huff[j+1]) {int temp=Huff[j];Huff[j]=Huff[j+1];Huff[j+1]=temp;}//更新數組順序 }新聞熱點
疑難解答