[問題描述]
n堆果子, 每堆果子數量任意,試設計一種最佳方案,將這n堆果子合併為一堆,使得合併工作量最小。
注:規定合併兩堆果子的工作量是這兩堆果子的數量之和。
[標準輸入]
m,n m表示m組測試資料,n表示每組測試資料數量不超過n個,每堆果子數量不超過10000。隨後的m行是測試資料。
[標準輸出]
m行資料表示對應果子的合併工作量
[輸入樣例]:
2 6
7, 5, 2, 4
5,6,2,9,7
[輸出樣例]: 35
65主要思想
果子合併問題可轉化為哈夫曼樹問題。先初始化,之後選取兩棵根結點的權值最小的樹作為左右子樹構造一棵新的二叉樹,且置新的二叉樹的根結點的權值為左右子樹上根結點的權值之和,最後把所有新建二叉樹根結點的權值加起來即為所求。
除錯分析
1、scanf不能對換行進行識別,所以控制輸入時要使用cin.get()。
2、初始化權值的時候要賦給其大數,不然作比較時會使程式出現錯誤。
**實現
#include//果子合併
#includeusing namespace std;
const int int=100000000;
typedef structhtnode,*huffmantree;
void select(huffmantree &ht,int n,int &s1,int &s2)
}for(int j=1;j<=n;j++)
int s1=1,s2=1,sum=0,w=i;
for(i=1;i<=(2*w-1);i++)
for(i=w+1;i<=(2*w-1);++i)
printf("%d\n",sum);
}int main()
return 0;
}
二叉樹實驗第三題
編寫演算法交換二叉樹中所有節點的左右子樹 include stdio.h include malloc.h define maxsize 10 節點個數 typedef struct nodebitree 奈蕎無音 鳴人的兒子博人問鳴人 爸爸,你年輕的時候幹了什麼偉大的事啊?鳴人摸了摸他的頭,然後說...
617 合併二叉樹
給定兩個二叉樹,想象當你將它們中的乙個覆蓋到另乙個上時,兩個二叉樹的一些節點便會重疊。你需要將他們合併為乙個新的二叉樹。合併的規則是如果兩個節點重疊,那麼將他們的值相加作為節點合併後的新值,否則不為 null 的節點將直接作為新二叉樹的節點。示例 1 輸入 tree 1 tree 2 1 2 3 2...
617 合併二叉樹
題目描述 給定兩個二叉樹,想象當你將它們中的乙個覆蓋到另乙個上時,兩個二叉樹的一些節點便會重疊。你需要將他們合併為乙個新的二叉樹。合併的規則是如果兩個節點重疊,那麼將他們的值相加作為節點合併後的新值,否則不為 null 的節點將直接作為新二叉樹的節點。示例 1 輸入 輸出 合併後的樹 注意 合併必須...