poj 3253 Fence Repair【哈夫曼树、优先队列】

简介: 点击打开题目 Fence Repair Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 27599   Accepted: 8983 Description ...

点击打开题目

Fence Repair
Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 27599   Accepted: 8983

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).
题目翻译:

FJ需要修补牧场的围栏,他需要 N 块长度为 Li 的木头(N planks of woods)。开始时,FJ只有一块无限长的木板,因此他需要把无限长的木板锯成 N 块长度为 Li 的木板,Farmer Don提供FJ锯子,但必须要收费的,收费的标准是对应每次据出木块的长度,比如说测试数据中 5 8 8,一开始,FJ需要在无限长的木板上锯下长度 21 的木板(5+8+8=21),第二次锯下长度为 5 的木板,第三次锯下长度为 8 的木板,至此就可以将长度分别为 5 8 8 的木板找出,第一次花费21,第二次花费5,第三次花费8,因此34=21+5+8;

解题思路:对给出的数据放到集合中,每次都找最小的两组,然后取出加和,然后累计花费,再将它们放到集合中,直到最后成对取完。

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
int main()
{
    priority_queue<__int64,vector<__int64>,greater<__int64> >a;
    int n,i;
    __int64 t,t1,s;
    while(scanf("%d",&n)==1){
        while(!a.empty()) a.pop();
        for(i=1;i<=n;i++){
            scanf("%I64d",&t);
            a.push(t);
        }
        s=0;
        while(a.size()>1){
            t=a.top(); a.pop();
            t1=a.top(); a.pop();
            a.push(t1+t);
            s+=t1+t;
        }
        printf("%I64d\n",s);
    }
    return 0;
}

目录
相关文章
|
Serverless C++
剑指offer(C++)-JZ79:判断是不是平衡二叉树(数据结构-树)
剑指offer(C++)-JZ79:判断是不是平衡二叉树(数据结构-树)
剑指offer(C++)-JZ79:判断是不是平衡二叉树(数据结构-树)
|
存储 机器学习/深度学习 算法
树结构--介绍--二叉树遍历的递归实现
树结构--介绍--二叉树遍历的递归实现
|
存储 C++
剑指offer(C++)-JZ8:二叉树的下一个结点(数据结构-树)
剑指offer(C++)-JZ8:二叉树的下一个结点(数据结构-树)
剑指offer(C++)-JZ68:二叉搜索树的最近公共祖先(数据结构-树)
剑指offer(C++)-JZ68:二叉搜索树的最近公共祖先(数据结构-树)
|
8月前
AVL树的原理以及实现
AVL树的原理以及实现
87 4
|
8月前
|
算法 C++ 索引
分享一个关于Avl树的迭代器算法
该文介绍了无parent指针的AVL树迭代实现,提出了一种仅使用少量栈空间的双向迭代算法。算法分为初始化、前向迭代和后向迭代三部分。初始化时,根据起始点(最小或最大值)填充栈,然后根据状态进行前向或后向迭代。前向迭代检查当前节点的右子节点,后向迭代检查左子节点。算法通过堆栈维持双向迭代,解决了节点丢失和失序问题。此外,还讨论了算法在多线程环境下的同步问题和可能的解决方案。
|
8月前
|
Java
POJ- 2367- Genealogical tree【拓扑排序】
POJ- 2367- Genealogical tree【拓扑排序】
34 0
|
8月前
AVL树的原理及其实现
AVL树的原理及其实现
剑指offer(C++)-JZ33:二叉搜索树的后序遍历序列(数据结构-树)
剑指offer(C++)-JZ33:二叉搜索树的后序遍历序列(数据结构-树)