编程算法 - 篱笆修理(Fence Repair) 堆(heap) 代码(C++)

篱笆修理(Fence Repair) 堆(heap) 代码(C++)

本文地址: http://blog.csdn.net/caroline_wendy

题目参考: http://blog.csdn.net/caroline_wendy/article/details/37911157

本题比较简单, 直接使用堆(heap)选取两个最小的值, 合并再放入堆, 最后求出和.

比起贪婪算法O(n^2), 时间复杂度O(nlogn).

代码:

/*
 * main.cpp
 *
 *  Created on: 2014.7.20
 *      Author: spike
 */

/*eclipse cdt, gcc 4.8.1*/

#include <stdio.h>

#include <queue>
#include <vector>
#include <functional>

using namespace std;

class Program {
	static const int MAX_N = 100;
	int N=3, L[MAX_N] = {8,5,8};
public:
	void solve() {
		int ans = 0;
		priority_queue<int, vector<int>, greater<int>> que;
		for (int i=0; i<N; i++) {
			que.push(L[i]);
		}
		while (que.size() > 1) {
			int l1, l2;
			l1 = que.top();
			que.pop();
			l2 = que.top();
			que.pop();
			ans += l1+l2;
			que.push(l1+l2);
		}
		printf("result = %d\n", ans);
	}
 };

int main(void)
{
	Program iP;
	iP.solve();

	return 0;
}

输出:

result = 34

时间: 2024-07-31 08:59:34

编程算法 - 篱笆修理(Fence Repair) 堆(heap) 代码(C++)的相关文章

编程算法 - 篱笆修理(Fence Repair) 代码(C)

篱笆修理(Fence Repair) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 把一块木板切成N块, 每次切两块, 切割的开销是木板长度, 求将木板切割完的最小开销. 即霍夫曼编码(Huffman). 贪心算法, 类似二叉树型结构, 最短板和次短板是兄弟结点, 选取两个最小木板, 最后进行切割, 合并两个最小木板, 依次递推. 代码: /* * main.cpp * * Created on: 2014.7.17 * Author:

编程算法 - 堆(heap) 代码(C)

堆(heap) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 堆(heap)作为二叉树的重要应用, 时间复杂度O(logn), 需要熟练的写出其代码, 基本代码如下, 需要背写. 代码: /* * main.cpp * * Created on: 2014.7.20 * Author: spike */ /*eclipse cdt, gcc 4.8.1*/ #include <stdio.h> class Heap { static const

编程算法 - 不能被继承的类(私有构造函数) 代码(C++)

不能被继承的类(私有构造函数) 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 用C++设计一个不能被继承的类. 可以使用私有构造函数, 并提供静态成员函数, 返回和删除类的实例. 则只能在堆上创建实例, 不能在栈上创建. 代码: /* * main.cpp * * Created on: 2014.7.13 * Author: Spike */ #include <iostream> #include <list> us

编程算法 - 把数组排成最小的数 代码(C)

把数组排成最小的数 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一个正整数数组, 把数组里所有数字拼接起来排成一个数, 打印能拼接出的所有数字中最小的一个. 大数转换为字符串, 重载快速排序的比较方法, 进行排序, 最后拼接. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <stdi

编程算法 - 最小的k个数 红黑树 代码(C++)

最小的k个数 红黑树 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入n个整数, 找出其中的最小k个数. 使用红黑树(multiset), 每次替换最大的值, 依次迭代. 时间复杂度: O(nlogk). 代码: /* * main.cpp * * Created on: 2014年6月29日 * Author: wang */ #include <iostream> #include <vector> #includ

编程算法 - 连续子数组的最大和 代码(C)

连续子数组的最大和 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一个整型数组, 数组里有正数也有负数. 数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值. 使用一个数保存当前和, 如果当前和为小于0,  则替换新值, 否则, 递加, 使用一个数保存临时最大值. 代码: /* * main.cpp * * Created on: 2014年6月29日 * Author: wang */ #include <stdio

编程算法 - 最好牛线(Best Cow Line) 代码(C)

最好牛线(Best Cow Line) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 给定长度为N的字符串S, 要构造一个长度为N的字符串T. 反复进行如下任意操作. 从S的头部删除一个字符, 放入T的尾部; 从S的尾部删除一个字符, 放入T的尾部; 目标是要构造字典序尽可能小的字符串T. 使用贪心算法, 不断选取S首尾最小的字符, 放入T, 如果相等, 则再次向内查找, 找到内部最小的. 代码: /* * main.cpp * * Cr

编程算法 - n个骰子的点数(递归) 代码(C)

n个骰子的点数(递归) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 把n个骰子仍在地上, 所有骰子朝上一面的点数之和为s. 输入n, 打印出s的所有可能的值出现的概率. 采用递归的方法, 可以假设只有一个骰子, 然后骰子数递增相加. 代码: /* * main.cpp * * Created on: 2014.7.12 * Author: spike */ #include <stdio.h> #include <stdlib.

编程算法 - 计算一个数的所有组合数 代码(C++)

计算一个数的所有组合数 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 计算一个数的组合数, 使用递归进行求解. 如果计算3位的组合数, 首先任选固定一位, 然后计算其余两位的组合数, 最后组合至一起. 如 1 + [23, 32] = 123, 132; 在固定其余位数, 如 2 + [13, 31] = 213, 231;  3 + [12, 21] = 312, 321; 程序分为两步分, 一个删除任意位置的一个元素, 一个是递归求解组合