题目 1724: [Usaco2006 Nov]Fence Repair 切割木板 Time Limit: 5 Sec  Memory Limit: 64 MB Description Farmer John想修理牧场栅栏的某些小段.为此,他需要N(1<=N<=20,000)块特定长度的木板,第i块木板的长度为Li(1<=Li<=50,000).然后,FJ去买了一块很长的木板,它的长度正好等于所有需要的木板的长度和.接下来的工作,当然是把它锯成需要的长度.FJ忽略所有切割时的损失—…
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1724 题意: 你要将一块长木板切成n段,长度分别为a[i](长木板的长度 = ∑ a[i]). 每一次切割的花费为被切割木板的长度. 问你切完的最小花费. 题解: 合并果子. 反过来想:切割 = 合并 贪心策略:每次选目前所有堆中最小的两个合并.(尽可能少移动大的果子堆) 实现:优先队列 AC Code: #include <iostream> #include <stdio.h…
Description Farmer John想修理牧场栅栏的某些小段.为此,他需要N(1<=N<=20,000)块特定长度的木板,第i块木板的长度为Li(1<=Li<=50,000).然后,FJ去买了一块很长的木板,它的长度正好等于所有需要的木板的长度和.接下来的工作,当然是把它锯成需要的长度.FJ忽略所有切割时的损失——你也应当忽略它. FJ郁闷地发现,他并没有锯子来把这块长木板锯开.于是他把这块长木板带到了Farmer Don的农场,想向FD借用锯子. 作为一个有商业头脑的资…
如果反着看,看成合并木板,就和合并果子一样了,把若干块放进一个小根堆,然后每次取出两个合并,把合并结果加进答案和堆里 代码里小根堆用优先队列实现(懒 #include<iostream> #include<cstdio> #include<queue> using namespace std; const int N=20005; int n; priority_queue<int,vector<int>,greater<int> >…
倒过来看 , 每次总是选择最短的两块木板合并 , 用heap维护 ------------------------------------------------------------------------------ #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<queue>   #define rep( i , n )…
1724: [Usaco2006 Nov]Fence Repair 切割木板 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 854  Solved: 426[Submit][Status] Description Farmer John想修理牧场栅栏的某些小段.为此,他需要N(1<=N<=20,000)块特定长度的木板,第i块木板的长度为Li(1<=Li<=50,000).然后,FJ去买了一块很长的木板,它的长度正好等于所有需要的木板的…
[算法]贪心+堆 #include<cstdio> #include<algorithm> using namespace std; ; int n,heap[maxn],sz; void heap_push(int x) { heap[++sz]=x;//新数入堆底 int now=sz;//以堆底为起点 &&heap[now]<heap[now>>])//非根节点的父亲>儿子时------注意非根判断 { swap(heap[now],h…
堆对于stl priority_queue ,我们自己定义的类自己重载<,对于非自定义类我们默认大根堆,如若改成小根堆则写成std::priority<int,vector<int>,greator<int> >.时间复杂度除了pop push是O(log)外都是O(1).当然手打会比stl快不少,下面介绍手打堆.对于手打堆他出来用于优先队列之外还能用于堆排序,就先建堆,然后依次取出.除已有操作以外,还有一个建堆过程,一般用于堆排序,就是一次把许多数的建成堆,就是…
Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1356  Solved: 714[Submit][Status][Discuss] Description Farmer John想修理牧场栅栏的某些小段.为此,他需要N(1<=N<=20,000)块特定长度的木板,第i块木板的长度为Li(1<=Li<=50,000).然后,FJ去买了一块很长的木板,它的长度正好等于所有需要的木板的长度和.接下来的工作,当然是把它锯成需要的长度.FJ忽略所…
一开始被题目读错题= =以为每次只能割一块,那么就是从大到小切 但是其实是可以分为几堆来切的 所以可以逆着来,变为合并n个木板代价最小 易证每次找最小的两堆合并代价最小 用优先队列维护堆..偷偷懒= = #include<stdio.h> #include<string.h> #include<algorithm> #include<queue> using namespace std; priority_queue<int,vector<int…