POJ---3253 Fence Repair

POJ—3253 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 needs N (1 ≤ N ≤ 20,000) planks of wood, each having some integer length Li (1 ≤ Li ≤ 50,000) units. He then purchases a single long board just long enough to saw into the N planks (i.e., whose length is the sum of the lengths Li). FJ is ignoring the “kerf”, the extra length lost to sawdust when a sawcut is made; you should ignore it, too.

FJ sadly realizes that he doesn’t own a saw with which to cut the wood, so he mosies over to Farmer Don’s Farm with this long board and politely asks if he may borrow a saw.

Farmer Don, a closet capitalist, doesn’t lend FJ a saw but instead offers to charge Farmer John for each of the N-1 cuts in the plank. The charge to cut a piece of wood is exactly equal to its length. Cutting a plank of length 21 costs 21 cents.

Farmer Don then lets Farmer John decide the order and locations to cut the plank. Help Farmer John determine the minimum amount of money he can spend to create the N planks. FJ knows that he can cut the board in various different orders which will result in different charges since the resulting intermediate planks are of different lengths.

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
Sample Input

3
8
5
8

Sample Output

34

Hint

He wants to cut a board of length 21 into pieces of lengths 8, 5, and 8.
The original board measures 8+5+8=21. The first cut will cost 21, and should be used to cut the board into pieces measuring 13 and 8. The second cut will cost 13, and should be used to cut the 13 into 8 and 5. This would cost 21+13=34. If the 21 was cut into 16 and 5 instead, the second cut would cost 16 for a total of 37 (which is more than 34).

中文翻译

题目描述

农夫约翰想修修牧场周围的一小部分篱笆。他测量围栏发现他需要N块(1≤ N ≤20000)木板,每一个都具有整数长度Li(1≤ Li≤50000)。然后,他购买了一块足够长的单板长板,以便得到N块木板(即长度为长度L i的总和)。约翰忽略了“切口”,当切割锯切时,木屑损失了额外的长度,你也应该忽略它。
约翰遗憾地意识到他没有切割木头的锯子,所以他去农夫唐的农场,礼貌地问他是否可以借锯。唐并没有借给约翰锯,而是向约翰提供了切割N -1块每块的切割费用。切割一块木头的费用与其长度完全相同。切割长度为21的木板需要21美分。
唐让约翰决定切割木板的顺序和位置。帮助约翰确定他得到N个木板的最低金额。约翰知道他可以以各种不同的顺序切割板,这将导致不同的费用,因为所得到的中间板具有不同的长度。
输入
第1行:一个整数N,木板的数量
第2行.N +1:每行包含一个描述所需木板长度的整数
输出
第1行:一个整数:他必须花费N -1削减的最低金额

样例输入
    3
    8
    5
    8
样例输出
    34

解题思路

这个题本质还是哈夫曼树的应用,以题中例子为例:总木板长度为:8+5+8=21,如果切一刀后切的两块分别为13,8,第一刀费用就为13+8=21;然后再把13继续切成5和8,那么第二刀费用就为5+8=13.这是正面考虑.从题目角度考虑,切成n个木块总费用就是所形成的二叉树新生成节点的频率之和.13+21=34.而当该树为哈夫曼树时,频率之和最小.

注意:

①当N=1时,费用就是该木块的长度.题目就是这样要求的.各位大神有其他见解的欢迎指教.
②这个题还用到了优先队列,不熟悉的朋友记得回去再熟悉下这个知识点哦.
③要注意题目中数据的范围,比如求费用时,int就不够用了,我用的是long long.

参考代码
#include<iostream>
#include<queue>
using namespace std;
priority_queue<int, vector<int>, greater<int> >Q;
long long total;
int main()
{
   
	int n,len;
	cin >> n;
	while (n--)
	{
   
		cin >> len;
		Q.push(len);
	}
	if (Q.size() == 1)
	{
   
		total = Q.top();
	}
	else
	{
   
		while (Q.size() > 1)
		{
   
			int sum = 0;
			sum += Q.top();
			Q.pop();
			sum += Q.top();
			Q.pop();
			Q.push(sum);
			total += sum;
		}
	}
	cout << total<<endl;

	return 0;
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
2025-11-19 14:56
点赞 评论 收藏
分享
头像
01-12 14:44
已编辑
百度_高级研发工程师
今天看到了某平台攻击牛友的帖子,段段今天打算为牛友们说句话,我们的努力到底有没有意义。&nbsp;(原文复述:感觉牛客就是当年那群做题区毕业了开始找工作还收不住那股味,颇有一种从年级第一掉到年纪第二后抱怨考不上大学的区味)&nbsp;&nbsp;粗鄙,无礼,傲慢,攻击,在这里我没有看到任何有用的分析,我只看到了屁股决定脑袋的攻击,我只看到了嫉妒和眼红。一、去医院不看病你去逛街吗&nbsp;去医院你不去看病你去逛街吗?去加油站不加油你去抽烟吗?去部队你不训练战斗技能你去养老吗?来牛客你不努力求职你来干什么来了。&nbsp;牛客本身就是个求职平台,大家分享有用的知识,分享面经,分享offer,分享求职经验的,来牛客不就干这个来了吗?有什么问题吗?...
给个好点的工作吧啊啊...:不知道我看的是不是和博主同样的帖子,我记得原帖是表达的是有些匿名老是发几十万的offer侮辱价,然后就有牛友觉得凡尔赛了导致后面的评论有些偏激。我觉得这个最近闫学晶那个事情有点类似了,她说他儿子一年只能赚七八十万家庭生活都难以为继,不说普通家庭,多少大厂的程序员都赚不到这个数字,大部分家庭看到这种发言肯定会难受的一p,生活的担子又这么重,人都是需要发泄情绪的,互联网就是个极佳的载体,所以很多人直接就喷她了,人在情绪发泄的时候是不思考的,否则就不叫发泄了。然后还有一个点,段哥假定了这些喷的人全都是“躺平的”,这点可能有失偏颇,很多人一直在努力,但是始终缺乏天时地利人和的某一个条件,这点相信段哥找工作的过程中深有体会。绝大部分人都以结果的失败去否认了努力的全过程,可能只是别人努力的方向错了。就像一次面试,可能你准备了很久,结果面试官就是比较奇葩,一直问没有学习到的领域或知识点,然后有人凭一个挂掉的结果就直接给你扣了一个“躺平”的帽子,觉得挂掉是你不够努力,您心里滋味如何?再说点近点的,我也是od,多少同事深夜无偿加班,涨过一分工资吗?多少外包的技术大牛因为学历被困在外包,连od都进不去,这些人难道不努力吗?只是限制与生活、公司制度等等之类的无奈罢了。说到努力,又想到李家琦79元眉笔事件,这么多年有没有认真工作?有没有涨工资?他嘴里说出来是那么的理所当然,打工牛马都知道“任劳任怨”,“认真工作”真能涨工资?只干活不发声就等着被摘果子吧,企业里永远都是“汇报杰出者”升的最快(当然不是所有企业),这种事情相信段哥包括我甚至大部分od都经历过。最近辞职回老家,和老爸散步每次他都会感慨街上的蔬菜小贩多不容易,他们晚上就窝在那种三轮小货车的驾驶室里,腿都伸不直,我们这里晚上零下了,只盖一条薄毛毯,始终舍不得住我们镇上几十块的酒店,因为一车蔬菜就赚几百块顶多一千而且要卖好久,这样的例子还有太多了。这种芸芸众生可能辛苦了一天之后,打开手机看到网上的凡尔赛发言,跟风喷了几句发泄情绪,我觉得这种人不应该扣上“躺平”的帽子。我觉得大部分正常人都是努力的,或者曾经努力过,但世界上有太多努力解决不了的无奈了,甚至说你都没有那个努力的机会,不过正因如此,才显得坚持不懈的努力奋斗之人的难得可贵,认清生活的真相后仍然热爱生活,敢于直面现实的淋漓。
段段STEADY觉醒与突...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务