算法(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 <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();
}



 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值