1.要考虑到规模为20,000 累加起来肯定会超的,要用long long 2. 思想就是先从正着推,一定是先切掉最长的那块,这样之后都不会受影响;再反着来想,就是先合并最小的 //#define LOCAL #include <cstdio> #include <cstring> #include <algorithm> #include <queue> #define N 20000 using namespace std; ...
【POJ 3253】Fence Repair 题解(贪心算法+优先队列+哈夫曼树),农夫约翰想修理牧场周围的一小段围栏。他测量了围栏,发现他需要N(1≤N≤20000)块木板,每块木板都有一定的整数长度Li(1≤Li≤50000)单位。然后,他购买了一块长度刚好足以锯入N块木板的长木板(即,其长
POJ 3253 Fence Repair (贪心) 题意:将一块木板切成N块,长度分别为:a1,a2,……an,每次切割木板的开销为当前木板的长度。求出按照要求将木板切割完毕后的最小开销。 思路:比较奇特的贪心 每次切割都会将当前木板一分为二,可以按切割要求画出二叉树。 总开销 = 各叶子节点的值 x 该叶子节点的深度 树的深度一...
而最后的代价总和是与子节点和深度相关的 由于切割的次数是确定的 该二叉树的节点就是确定的。 也就是说我们可以贪心的处理 最小长度的子节点放在最下面 如图 ac代码如下 使用了堆 记录每次最小的元素 堆的使用真的不是很方便 , 另外还需要注意 爆int 所以需要使用long long 记录元素的和 View Code stl 堆 ...
Input Line 1: One integer N, the number of planks Lines 2..N+1: Each line contains a single integer describing the length of a needed plank Output Line 1: One integer: the minimum amount of money he must spend to make N-1 cuts ...
这是最开始我们把21据下来之后我们据下8,然后再据下5得到34,可以看出13被用到2次,8被用到1次13*2+8=34。 这幅图片,我们先据下21,再据下5,再据下8得到34,即16*2+5=37。 所以,对于这道题,我们运用贪心的思想和哈夫曼树 1#include<queue>2#include<stdio.h>3usingnamespacestd;4intmain()5{6long...
很然自的想到的哈夫曼树(贪心略策). 但是怎么样排序有效率呢? 每次只是出取两个最小的,然后再相加,再放进去,再排序。 经过测试,一般的排序会超时。 上面代码运行准确,但是超时. 主要是sort 数函太费时了,认为每次排序只是插入一个数而已。 每日一道理 ...
链接:http://poj.org/problem?id=3253 题意:农夫准备把木板切成n块,每块长度为Li,每次切木板时需要花费切时木板的长度的开销(比如把21切成13和8,开销就是切之前的长度12)。计算把木板切完的最小开销。 思路:直接拿刀去切木板貌似没有什么贪心的思路呀。但是我们把切的过程画成树的样子就会发现开销等于各叶子...
POJ3253(贪心) Fence Repair Description Farmer John wants to repair a small length of the fence around the pasture. He measures the fence and finds that he needsN(1 ≤N≤ 20,000) planks of wood, each having some integer lengthLi(1 ≤Li≤ 50,000) units. He then purchases a single ...
贪心算法。 一开始想错,以为每次切掉最长的,其实不然,没有理解题意。 其实题目说的是每次切掉部分的两块的和才为费用。 dicuss里有大神的关于Huffman树的思路“ 我们不妨将切木板的过程反过来看,也就是将所有切好了的木板每次拿两块拼接起来(每次拼接后的长度就是费用),最终便会拼接成原来的完整的木板。显然,这...