题目描述

农夫约翰为了修理栅栏,要将一块很长的木板切割成N块。准备切成的木板长度为L1,L2,L3……LN,未切割前木板的长度恰好为切割后木板长度的总和。每次切断木板时,需要的开销为这块木板的长度。请求出按照目标要求将木板切割完的最小开销是多少?例如长度为21的木板切割成长度为13和8,开销为21;把长度为13的木板切割成5和8,则开销为13,所以将长度为21的木板切割成8,5,8的三块,开销是34.

样例输入

N = 3, L = {8,5,8}

样例输出

34

思路分析

3

5 8 5为例:

先从无限长的木板上锯下长度为 21 的木板,花费 21

再从长度为21的木板上锯下长度为5的木板,花费5

再从长度为16的木板上锯下长度为8的木板,花费8

总花费 = 21+5+8 =34
更多详细请见《挑战程序设计》p48-49

AC代码

# include <iostream>
# include <algorithm>
using namespace std;
const int MAX_N = 10000;
int N, L[MAX_N];

void solve()
{
    long long ans = 0;

    while (N > 1)//直到计算到木板为一块时为止
    {
        int min1 = 0, min2 = 1;
        if (L[min1] > L[min2]) swap(min1, min2);//swap 函数的作用是实现两个变量的交换,用到algorithm
        for (int i = 2; i < N; i++)//从第三块板子开始
        {
            if (L[i] < L[min1])//用第一块和第三块或者后面的板子进行比较,把最小的作为第一块,那么原来的第一块小则变成此时的第二块小
            {                   //此时真正的第一小已经确定
                min2 = min1;
                min1 = i;
            }
            else if (L[i] < L[min2])//再把此时的第二块小和第三块以及第三块后面的进行比较,再找一个最小的
            {                       //作为真正的第二小
                min2 = i;
            }
        }
        //将两块板进行拼合
        int t = L[min1] + L[min2];
        ans += t;

        //整体的思想,采用递归
        if (min1 == N - 1) swap(min1, min2);
        L[min1] = t;
        L[min2] = L[N - 1];
        N--;

    }
    printf("%lld\n", ans);

}
int main()
{
    scanf("%d", &N);

    for (int i = 0; i < N; i++)
    {
        scanf("%d", &L[i]);
    }
    solve();
    getchar();
    getchar();
    return 0;
}

小结

本题目好像用到了霍夫曼编码hahah,自己看吧。我也不是很懂....

贪心算法——Fence Repair(POJ 3253)的更多相关文章

  1. Fence Repair POJ - 3253 (贪心)

    Farmer John wants to repair a small length of the fence around the pasture. He measures the fence an ...

  2. R - Fence Repair POJ - 3253

    Farmer John wants to repair a small length of the fence around the pasture. He measures the fence an ...

  3. Fence Repair (POJ 3253)

    农夫约翰为了修理栅栏,要将一块很长的木板切割成N块.准备切成的木板长度为L1.L2.L3...LN,未切割前的木板长度恰好为切割后木板长度的总和.每次切断木板时,需要的开销为这块木板的长度.例如长度为 ...

  4. Fence Repair POJ - 3253 哈夫曼思想 优先队列

    题意:给出一段无限长的棍子,切一刀需要的代价是棍子的总长,例如21切一刀 变成什么长度 都是代价21 列如7切成5 和2 也是代价7题解:可以利用霍夫曼编码的思想 短的棍子就放在底层 长的尽量切少一次 ...

  5. POJ 3253 Fence Repair (贪心)

    Fence Repair Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit ...

  6. POJ 3253 Fence Repair 贪心 优先级队列

    Fence Repair Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 77001   Accepted: 25185 De ...

  7. POJ - 3253 Fence Repair 优先队列+贪心

    Fence Repair Farmer John wants to repair a small length of the fence around the pasture. He measures ...

  8. poj 3253 Fence Repair 贪心 最小堆 题解《挑战程序设计竞赛》

    地址 http://poj.org/problem?id=3253 题解 本题是<挑战程序设计>一书的例题 根据树中描述 所有切割的代价 可以形成一颗二叉树 而最后的代价总和是与子节点和深 ...

  9. POJ 3253 Fence Repair【哈弗曼树/贪心/优先队列】

    Fence Repair Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 53645   Accepted: 17670 De ...

随机推荐

  1. NOIP2017-普及组复赛第2题 题解

    Description 图书馆中每本书都有一个图书编码,可以用于快速检索图书,这个图书编码是一个正整数.  每位借书的读者手中有一个需求码,这个需求码也是一个正整数.如果一本书的图书编码恰好以读者的需 ...

  2. Vue之彻底理解自定义组件的v-model

    最近在学习vue,今天看到自定义事件的表单输入组件,纠结了一会会然后恍然大悟...官方教程写得不是很详细,所以我决定总结一下. v-model语法糖 v-model实现了表单输入的双向绑定,我们一般是 ...

  3. while循环小练习-猜答案

    条件 1.每个用户只能猜10次产品的价格2.每次猜玩价格,提示用户价格是多了还是少了或者对了3.如果用户才对则终止程序执行 break! i = 0 #设置一个次数变量 price = 38 #设置一 ...

  4. 华南师大 2017 年 ACM 程序设计竞赛新生初赛题解

    题解 被你们虐了千百遍的题目和 OJ 也很累的,也想要休息,所以你们别想了,行行好放过它们,我们来看题解吧... A. 诡异的计数法 Description cgy 太喜欢质数了以至于他计数也需要用质 ...

  5. Java(概略篇)

    准备 下载并安装Java jdk 和 编辑器(eclipse或Netbeans) 配置环境变量 第一个程序 public class test{ public static void main(Str ...

  6. <meta http-equiv="X-UA-Compatible" content="IE=edge">的作用

    X-UA-Compatible是针对ie8新加的一个设置,对于ie8之外的浏览器是不识别的. X-UA-Compatible 是针对 IE8 版本的一个特殊文件头标记,用于为 IE8 指定不同的页面渲 ...

  7. 04.redis集群+SSM整合使用

    redis集群+SSM整合使用 首先是创建redis-cluster文件夹: 因为redis最少需要6个节点(三主三从),为了更好的理解,我这里创建了两台虚拟机(192.168.0.109 192.1 ...

  8. nginx的基础应用(续)

    nginx的基础应用(续) 一.简介 上一篇文章我们介绍了nginx的基础应用,其中讲到了nginx作为代理服务器的使用,但是漏了一个重要的,也是使用非常普遍的特性--负载均衡.今天,我们将这段内容补 ...

  9. linux API函数大全

    获取当前执行路径:getcwd1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAdd ...

  10. java桌面程序打包教程

    首先打包成j可执行的jar文件. . 接下来找到自己生成jar文件的路径就可以看到jar文件了,我的是在桌面: 在桌面新建一个文件夹(名字随便取,一般去项目名字) 上面是我取的文件夹名字,然后把资料文 ...