4-07. 修理牧场(25) (ZJU_PAT 优先队列)

题目链接:http://pat.zju.edu.cn/contests/ds/4-07

农夫要修理牧场的一段栅栏,他测量了栅栏,发现需要N块木头,每块木头长度为整数Li个长度单位,于是他购买了一条很长的、能锯成N块的木头,即该木头的长度是Li的总和。

但是农夫自己没有锯子,请人锯木的酬金跟这段木头的长度成正比。为简单起见,不妨就设酬金等于所锯木头的长度。例如,要将长度为20的木头锯成长度为8、7和5的三段,第一次锯木头花费20,将木头锯成12和8;第二次锯木头花费12,将长度为12的木头锯成7和5,总花费为32。如果第一次将木头锯成15和5,则第二次锯木头花费15,总花费为35(大于32)。

请编写程序帮助农夫计算将木头锯成N块的最少花费。

输入格式说明:

输入首先给出正整数N(<=104),表示要将木头锯成N块。第2行给出N个正整数(<=50),表示每段木块的长度。

输出格式说明:

输出一个整数,即将木头锯成N块的最少花费。

样例输入与输出:

序号 输入 输出
1
8
4 5 1 2 1 3 1 1
49
2
1
1
0

PS:

此题可谓和POJ:3253一模一样!数据更小!

附POJ3253题解:http://blog.csdn.net/u012860063/article/details/34805369

思路:

要使总费用最小,那么每次只选取最小长度的两块木板相加,再把这些“和”累加到总费用中即可;

代码如下:

#include <cstdio>
#include <algorithm>
#include <queue>
#include <cstring>
using namespace std;
int main()
{
    int n;
    int tt;
    while(~scanf("%d",&n))
    {
        priority_queue<int,vector<int>, greater<int> >Q;
        while(!Q.empty())
        {
            Q.pop();
        }
        for(int i = 1; i <= n; i++)
        {
            scanf("%d",&tt);
            Q.push(tt);
        }
        int ans = 0;
        while(Q.size() > 1)
        {
            int a = Q.top();
            Q.pop();
            int b = Q.top();
            Q.pop();
            Q.push(a+b);
            ans += a+b;
        }
        printf("%d\n",ans);
    }
    return 0;
}

/*
3
8 7 5
*/
时间: 2024-10-14 08:55:45

4-07. 修理牧场(25) (ZJU_PAT 优先队列)的相关文章

7-29 修理牧场

7-29 修理牧场(25 分) 农夫要修理牧场的一段栅栏,他测量了栅栏,发现需要N块木头,每块木头长度为整数L?i??个长度单位,于是他购买了一条很长的.能锯成N块的木头,即该木头的长度是L?i??的总和. 但是农夫自己没有锯子,请人锯木的酬金跟这段木头的长度成正比.为简单起见,不妨就设酬金等于所锯木头的长度.例如,要将长度为20的木头锯成长度为8.7和5的三段,第一次锯木头花费20,将木头锯成12和8:第二次锯木头花费12,将长度为12的木头锯成7和5,总花费为32.如果第一次将木头锯成15和

修理牧场 (哈夫曼树)

修理牧场 农夫要修理牧场的一段栅栏,他测量了栅栏,发现需要N块木头,每块木头长度为整数L?i??个长度单位,于是他购买了一条很长的.能锯成N块的木头,即该木头的长度是L?i??的总和. 但是农夫自己没有锯子,请人锯木的酬金跟这段木头的长度成正比.为简单起见,不妨就设酬金等于所锯木头的长度.例如,要将长度为20的木头锯成长度为8.7和5的三段,第一次锯木头花费20,将木头锯成12和8:第二次锯木头花费12,将长度为12的木头锯成7和5,总花费为32.如果第一次将木头锯成15和5,则第二次锯木头花费

日本IT行业劳动力缺口达22万 在日中国留学生迎来就业好时机 2017/07/18 11:25:09

作者:倪亚敏 来源:日本新华侨报 发布时间:2017/07/18 11:25:09   据日本政府提供的数据,日本2018年应届毕业生的"求人倍率"已经达到了1.78倍.换言之,就是100名大学生里有178个就业岗位可选择,即使所有大学毕业生都进入劳动力市场,也还有78个岗位空缺.劳动力现状是寒冷冬天,而学生们确实迎来了就业春天. 在众多岗位当中,日本的信息技术(IT)领域采用的外国人留学生最多.去年,已经在日本企业就职的留学生当中(除去制造行业),27.3%的毕业生进入了IT行业.根

BZOJ1724: [Usaco2006 Nov]Fence Repair 切割木板

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1724 题目大意: Farmer John想修理牧场栅栏的某些小段.为此,他需要N(1<=N<=20,000)块特定长度的木板,第i块木板的长度为Li(1<=Li<=50,000).然后,FJ去买了一块很长的木板,它的长度正好等于所有需要的木板的长度和.接下来的工作,当然是把它锯成需要的长度.FJ忽略所有切割时的损失——你也应当忽略它. FJ郁闷地发现,他并没有锯子来把这块长木

BZOJ 1724: [Usaco2006 Nov]Fence Repair 切割木板

题目 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忽略所有切割时的损失—

1724: [Usaco2006 Nov]Fence Repair 切割木板

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去买了一块很长的木板,它的长度正好等于所有需要的木板的

queue容器(c++)

一.queue模版类的定义在<queue>头文件中. queue与stack模版非常类似,queue模版也需要定义两个模版参数,一个是元素类型,一个是容器类型,元素类型是必要的,容器类型是可选的,默认为dqueue类型. 定义queue对象的示例代码如下: queue<int>q1; queue<double>q2; queue的基本操作有: 1.入队:如q.push(x):将x元素接到队列的末端: 2.出队:如q.pop() 弹出队列的第一个元素,并不会返回元素的值:

第04次作业-树

第04次作业-树 1.学习总结 1.1树结构思维导图 1.2 树结构学习体会 树的结构是一种非线性结构,一对多,定义也是递归的,有一个根结点和任意个子树. 我的学习体会:我觉得树相比之前的一对一的线性结构来说,难度增大了很多,树的实现又会借用到之前学的栈啊,队列啊,就像是之前所学的大杂烩,并且会用上递归,虽然递归可读性很好,但是想出怎么写也是很难,看懂容易,自己写递归不容易. 树可以应用在查找,如二叉搜索树,用在求类似最优路径的问题,如哈夫曼树,应用在做计算表达式,把表达式转化成树,再求值,能算

Oracle 12c RAC 搭建手册

1  共享设备配置 1.1            设备划分说明 冗余策略 卷划分及大小说明 OCRVOTING Ocrvoting01 8G Ocrvoting02 8G Ocrvoting03 8G DATAFILE Data01 8G Data02 8G FRA_ARCH Fra01 8G Fra02 8G 我们这里OCRVOTING 采用Normal,DATA和FRA 采用external. 11g中每个OCR和vote disk 至少需要600M空间.在ASM 的冗余级别中: exter