Time Limit: 1 second

Memory Limit: 128 MB

【问题描述】

  瑞瑞想要亲自修复在他的一个小牧场周围的围栏。他测量栅栏并发现他需要N(1≤N≤20,000)根木板,每根的长度为整数Li(1≤Li≤50,000)。于是,他神奇地买了一根足够长的木板,长度为所需的N根木板的长度的总和,他决定将这根木板切成所需的N根木板。(瑞瑞在切割木板时不会产生木屑,不需考虑切割时损耗的长度) 瑞瑞切割木板时使用的是一种特殊的方式,这种方式在将一根长度为x的模板切为两根时,需要消耗x个单位的能量。瑞瑞拥有无尽的能量,但现在提倡节约能量,所以作为榜样,他决定尽可能节约能量。显然,总共需要切割N-1次,问题是,每次应该怎么切呢?请编程计算最少需要消耗的能量总和。

【输入格式】

第一行: 整数N,表示所需木板的数量 第2到N+1行: 每行为一个整数,表示一块木板的长度

【输出格式】

一个整数,表示最少需要消耗的能量总和

【数据规模】

Sample Input1

3
8
5
8

Sample Output1

34

【样例说明】

将长度为21的木板,第一次切割为长度为8和长度为13的,消耗21个单位的能量,第二次将长度为13的木板切割为长度为5和8的,消耗13个单位的能量,共消耗34个单位的能量,是消耗能量最小的方案。

【题解】

这题需要反过来想。

把一块长木板分成n个小木板,它的逆过程。就是

把n块小木板拼成1块长木板。

然后本来是每次消耗所需要切割的长度的体力。

现在变成消耗掉两块木板拼起来的长度等价的体力。

然后依然是操作n-1次。

则。每次只要选择最短和次短的两块木板拼起来就可以了。这样可以保证每次进行的操作都是花费最小的。

而维护最小值。需要用到堆(小根堆)。

【代码】

#include <cstdio>

__int64 dui[20001] = { 0 };//记录堆的信息。小根堆。
int n,pos; void up_adjust(int p)//从位置p开始往上调整堆。
{
__int64 x = dui[p];//先记录堆中这个元素的大小。
int i = p, j = p / 2;
while (j > 0)//如果还没到根节点。
{
if (x < dui[j])//如果需要调整则调整
{
dui[i] = dui[j];
i = j;
j = i / 2;
}
else//不需要调整了就结束。
break;
}
dui[i] = x;
pos = i;//记录下新的位置。方便继续尝试往下调整。
} void down_adjust(int p)//从位置p开始往下调整
{
__int64 x = dui[p];
int i = p, j = p * 2;
while (j <= dui[0])//如果没到叶子节点
{
if (j < dui[0] && dui[j + 1] < dui[j])//如果右儿子更小则和右儿子尝试交换。
j++;
if (x > dui[j])//如果需要调整,则调整。
{
dui[i] = dui[j];
i = j;
j = i * 2;
}
else
break;
}
dui[i] = x;//把这个元素放到新的位置。
} void input_data()
{
scanf("%d", &n);//输入数据
for (int i = 1; i <= n; i++)//依次把n个数据加入到堆中去。
{
int x;
scanf("%d", &x);
dui[0]++;
dui[dui[0]] = x;
up_adjust(dui[0]);//因为加到叶子节点。所以要先往上调整。
down_adjust(pos);//然后再往下调整。
}
} void get_ans()
{
__int64 ans = 0;//答案一开始为0
for (int i = 1; i <= n - 1; i++)
{
__int64 x = dui[1];//取出一个元素。进行调整
dui[1] = dui[dui[0]];
dui[0] --;
down_adjust(1);
__int64 y = dui[1];//再取出另一个次小的。再调整。
dui[1] = dui[dui[0]];
dui[0]--;
down_adjust(1);
__int64 z = x + y;//把这两个木块拼在一起。
ans += z;//累加答案。
dui[0]++;//把拼出来的新木板再加入到堆中去。
dui[dui[0]] = z;
up_adjust(dui[0]);//向上调整。再向下调整即可。
down_adjust(pos);
}
printf("%I64d\n", ans);
} int main()
{
input_data();
get_ans();
return 0;
}

【u009】瑞瑞的木板的更多相关文章

  1. 洛谷【P1090】合并果子&&洛谷【P1334】瑞瑞的木板

    浅谈堆:https://www.cnblogs.com/AKMer/p/10284629.html 合并果子题目传送门:https://www.luogu.org/problemnew/show/P1 ...

  2. 洛谷 P1334 瑞瑞的木板==P2664 【题目待添加】

    题目描述 瑞瑞想要亲自修复在他的一个小牧场周围的围栏.他测量栅栏并发现他需要N(1≤N≤20,000)根木板,每根的长度为整数Li(1≤Li≤50,000).于是,他神奇地买了一根足够长的木板,长度为 ...

  3. P1334 瑞瑞的木板 洛谷

    https://www.luogu.org/problem/show?pid=1334 题目描述 瑞瑞想要亲自修复在他的一个小牧场周围的围栏.他测量栅栏并发现他需要N(1≤N≤20,000)根木板,每 ...

  4. P1334 瑞瑞的木板

    题目描述 瑞瑞想要亲自修复在他的一个小牧场周围的围栏.他测量栅栏并发现他需要N(1≤N≤20,000)根木板,每根的长度为整数Li(1≤Li≤50,000).于是,他神奇地买了一根足够长的木板,长度为 ...

  5. 洛谷 P1334 瑞瑞的木板

    P1334 瑞瑞的木板 题目描述 瑞瑞想要亲自修复在他的一个小牧场周围的围栏.他测量栅栏并发现他需要N(1≤N≤20,000)根木板,每根的长度为整数Li(1≤Li≤50,000).于是,他神奇地买了 ...

  6. 洛谷P1333 瑞瑞的木棍(欧拉回路)

    题目描述 瑞瑞有一堆的玩具木棍,每根木棍的两端分别被染上了某种颜色,现在他突然有了一个想法,想要把这些木棍连在一起拼成一条线,并且使得木棍与木棍相接触的两端颜色都是相同的,给出每根木棍两端的颜色,请问 ...

  7. 【u008】瑞瑞的木棍

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 瑞瑞有一堆的玩具木棍,每根木棍的两端分别被染上了某种颜色,现在他突然有了一个想法,想要把这 些木棍连在 ...

  8. 题解 P1334 【瑞瑞的木板】

    声明:本题解已经与其他题解重合, ### 且存在压行情况. 首先,这个题解是我有了惨痛的教训:全部WA... 先发一个CODE做声明: #include <bits/stdc++.h> / ...

  9. Luogu [P1334] 瑞瑞的木板(手写堆)

    其实这个题完全不需要用手写堆,只需要一遍遍sort就行了…… 但是! 为了练习手写堆,还是用手写堆做了. 在做本题之前,如果你没有什么思路的话,建议先做Luogu的合并果子. 好,假设你已经做过了合并 ...

随机推荐

  1. Flask项目之手机端租房网站功能测试(完结)

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 目录 一丶注册和登录以及用户退出功能 二丶上传头像功能和修改用户名功能测试 三丶发布房源以及实名认证功能测试 四丶网站房屋搜索功能 ...

  2. C#调用C++生成的动态链接库DLL

    一.背景 由于要使用C#写app,所以要把C++生成的DLL在C#中调用,所以就涉及怎样去调用外部的dll问题. 二.C#调用外部DLL 首先先看下C#调用外部DLL的代码 using System. ...

  3. 洛谷 P1480 A/B Problem

    P1480 A/B Problem 题目描述 输入两个整数a,b,输出它们的商(a<=10^5000,b<=10^9) 输入输出格式 输入格式: 两行,第一行是被除数,第二行是除数. 输出 ...

  4. css中的!important作用

    css中的!important作用 一.总结 1.!important:是hack, 2.!important作用:让浏览器首选执行这个语句,当对同一个对象设置了多个同类型的属性的时候,首选执行这一个 ...

  5. 解决浏览器不兼容websocket

    本例使用tomcat 7.0的websocket做为例子. 1.新建web project.2.找到tomcat 7.0 lib 下的 catalina.jar,tomcat-coyote.jar添加 ...

  6. 二、MongoDB基础知识

    1.文档是MongoDB的核心概念.文档就是键值对的一个有序集{'msg':'hello','foo':3}.类似于python中的有序字典. 需要注意的是: #1.文档中的键/值对是有序的. #2. ...

  7. sql server备份与还原 sql语句

    USE master DECLARE tb CURSOR LOCAL FOR SELECT 'Kill '+ CAST(Spid AS VARCHAR) FROM master.dbo.sysproc ...

  8. jfreechart,pdf生成组件iText,jasper report报表组件及POI操作excel等在企业软件开发中常遇到的第三方应用

    熟悉WEB Service ,Ajax,DWR,JQuery,iBatis等技术,熟练TOMCAT,IIS,JBoss,WebLogic等服务器 图表组件JFreeChart PDF组件-iText的 ...

  9. Kaggle实战分类问题2

    Kaggle实战之二分类问题 0. 前言 1. MNIST 数据集 2. 二分类器 3. 效果评测 4. 多分类器与误差分析 5. Kaggle 实战 0. 前言 “尽管新技术新算法层出不穷,但是掌握 ...

  10. 编程一一C语言的问题,cpu中的专用寄存器