算法(32)-贪心(2)-切金条问题-C++

问题:

    一块金条切成两半,是需要花费和长度数值一样的铜板的。比如 长度为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 
#include 
#include 

#include "SF.h"
using namespace std;

 
class MinheapComparator
{
public:
	bool operator ()(const int n1, const int n2)const
	{
		return n1, greater> 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) <, greater> 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, 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, 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******************"<



 

你可能感兴趣的:(C++,算法)