问题:
一块金条切成两半,是需要花费和长度数值一样的铜板的。比如 长度为20的 金条,不管切成长度多大的两半,
都要花费20个铜 板。一群人想整分整块金 条,怎么分最省铜板? 例如,给定数组{10,20,30},代表一共三个人,
整块金条长度为 10+20+30=60. 金条要分成10,20,30三个部分。 如果, 先把长 度60的金条分成10和50,
花费60 再把长度50的金条分成20和30, 花费50 一共花费110铜板。 但是如果, 先把长度60的金条分成30
和30,花费60 再把长度30 金条分成10和20,花费30 一共花费90铜板。 输入一个数组,返回分割的最小代价。
思路:哈夫曼编码 ,小根堆
C++代码
/*
贪心2 分金条
小根堆
*/
#include <iostream>
#include <queue>
#include <functional>
#include "SF.h"
using namespace std;
class MinheapComparator
{
public:
bool operator ()(const int n1, const int n2)const
{
return n1<n2;
}
};
class MaxheapComparator
{
public:
bool operator ()(const int n1, const int n2)const
{
return n2<n1;
}
};
int lessMoney(int arr[],int m_num) //输入数组
{
cout<<"******lessMoney******"<<endl;
priority_queue<int, vector<int>, greater<int>> pQ;//小根堆
for (int i = 0; i < m_num; i++)
{
pQ.push(arr[i]); // 1.所有数字扔到小根堆里去
}
int sum = 0;
int cur = 0;
while (pQ.size() > 1) { //4.周而复始,当小根堆只剩一个数 这就是代价之一
int temp1 = pQ.top();
pQ.pop();
int temp2 = pQ.top();
pQ.pop();
cur = temp1 + temp2; //2.弹两个合一个数
sum += cur;
pQ.push(cur); //3.把这个数扔到小根堆里去
}
return sum;
}
void lessMoneySplitGold_test()
{
int arr[] = { 6, 7, 8, 9 };
cout<< lessMoney(arr,4) <<endl;
int arrForHeap[] = { 3, 5, 2, 7, 0, 1, 6, 4 };
int arrForHeap_len = 8;
// min heap
cout<<"*******minheap ********"<<endl;
priority_queue<int, vector<int>, greater<int>> minQ1;
for (int i = 0; i < arrForHeap_len; i++)
{
minQ1.push(arrForHeap[i]);
}
while (!minQ1.empty())
{
cout << minQ1.top() << " " << endl;
minQ1.pop();
}
// min heap use Comparator
cout << "*******min heap use Comparator ********" << endl;
priority_queue<int, vector<int>, MinheapComparator> minQ2;
for (int i = 0; i < arrForHeap_len; i++) {
minQ2.push(arrForHeap[i]);
}
while (!minQ2.empty()) {
cout << minQ2.top() << " " << endl; 弹出
minQ2.pop(); //删除
}
cout << "*******max heap use Comparator ********" << endl;
// max heap use Comparator
priority_queue<int, vector<int>, MaxheapComparator> maxQ;
for (int i = 0; i < arrForHeap_len; i++)
{
maxQ.push(arrForHeap[i]);
}
while (!maxQ.empty()) {
cout << maxQ.top() << " " << endl;
maxQ.pop();
}
}
void lessMoneySplitGold_main()
{
cout<<"***************lessMoneySplitGold_main******************"<<endl;
lessMoneySplitGold_test();
}