【u009】瑞瑞的木板
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】瑞瑞的木板的更多相关文章
- 洛谷【P1090】合并果子&&洛谷【P1334】瑞瑞的木板
浅谈堆:https://www.cnblogs.com/AKMer/p/10284629.html 合并果子题目传送门:https://www.luogu.org/problemnew/show/P1 ...
- 洛谷 P1334 瑞瑞的木板==P2664 【题目待添加】
题目描述 瑞瑞想要亲自修复在他的一个小牧场周围的围栏.他测量栅栏并发现他需要N(1≤N≤20,000)根木板,每根的长度为整数Li(1≤Li≤50,000).于是,他神奇地买了一根足够长的木板,长度为 ...
- P1334 瑞瑞的木板 洛谷
https://www.luogu.org/problem/show?pid=1334 题目描述 瑞瑞想要亲自修复在他的一个小牧场周围的围栏.他测量栅栏并发现他需要N(1≤N≤20,000)根木板,每 ...
- P1334 瑞瑞的木板
题目描述 瑞瑞想要亲自修复在他的一个小牧场周围的围栏.他测量栅栏并发现他需要N(1≤N≤20,000)根木板,每根的长度为整数Li(1≤Li≤50,000).于是,他神奇地买了一根足够长的木板,长度为 ...
- 洛谷 P1334 瑞瑞的木板
P1334 瑞瑞的木板 题目描述 瑞瑞想要亲自修复在他的一个小牧场周围的围栏.他测量栅栏并发现他需要N(1≤N≤20,000)根木板,每根的长度为整数Li(1≤Li≤50,000).于是,他神奇地买了 ...
- 洛谷P1333 瑞瑞的木棍(欧拉回路)
题目描述 瑞瑞有一堆的玩具木棍,每根木棍的两端分别被染上了某种颜色,现在他突然有了一个想法,想要把这些木棍连在一起拼成一条线,并且使得木棍与木棍相接触的两端颜色都是相同的,给出每根木棍两端的颜色,请问 ...
- 【u008】瑞瑞的木棍
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 瑞瑞有一堆的玩具木棍,每根木棍的两端分别被染上了某种颜色,现在他突然有了一个想法,想要把这 些木棍连在 ...
- 题解 P1334 【瑞瑞的木板】
声明:本题解已经与其他题解重合, ### 且存在压行情况. 首先,这个题解是我有了惨痛的教训:全部WA... 先发一个CODE做声明: #include <bits/stdc++.h> / ...
- Luogu [P1334] 瑞瑞的木板(手写堆)
其实这个题完全不需要用手写堆,只需要一遍遍sort就行了…… 但是! 为了练习手写堆,还是用手写堆做了. 在做本题之前,如果你没有什么思路的话,建议先做Luogu的合并果子. 好,假设你已经做过了合并 ...
随机推荐
- 基于jQuery的一组图片的滚动
css: .displayB{display:block;}.fl{float:left;}.fr{float: right;}.posAb{position: absolute;}.posRe{po ...
- 如何去掉bootstrap table中表格样式中横线竖线
修改之前,表格看上去比较拥挤,因为bootstrap table插件中自带斑马线表格样式,有横线和竖线分栏,现在我们不需要这些. 应UI设计的要求,要去掉中间的横线和竖线,使用了修改需求中一种简单粗暴 ...
- amazeui学习笔记--css(常用组件7)--输入框组Input-group
amazeui学习笔记--css(常用组件7)--输入框组Input-group 一.总结 1.使用:Input group 基于 Form 组件和 Button 组件扩展,依赖这两个组件.在容器上添 ...
- 详解javascript的深拷贝与浅拷贝
1. 认识深拷贝和浅拷贝 javascript中一般有按值传递和按引用传递两种复制,按值传递的是基本数据类型(Number,String,Boolean,Null,Undefined),一般存放于内存 ...
- Altium Designer中敷铜和板子一样大
- HDU 5237 Base64
Base64 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Sub ...
- 辛星彻底帮您解决CSS中的浮动问题
浮动,是CSS布局中必须经过的一道坎,假设不熟悉浮动.那么CSS的布局就如同空中楼阁,而谈到浮动,很多其它的是和div相结合,div是一个块级元素.这个我前面的博文有介绍,假设大家喜欢我的风格,能够搜 ...
- wepy小程序实现列表分页上拉加载(1)
使用wepy开发微信小程序商城第一篇:项目初始化 使用wepy开发微信小程序商城第二篇:路由配置和页面结构 列表页效果图: 1.新建列表页 (1)在pages里面新建一个list.wpy文件 初始代码 ...
- php 如何写一个自己项目的安装程序
版权声明:此篇文章只是用作笔记,如果版权冲突,请邮件通知一下(15201155501@163.com) https://blog.csdn.net/shenpengchao/article/detai ...
- ORACLE RMAN备份及还原 RMAN能够进行增量备份:数据库,表空间,数据文件
ORACLE RMAN备份及还原 RMAN能够进行增量备份:数据库.表空间.数据文件 仅仅有使用过的block能够被备份成backup set 表空间与数据文件相应关系:dba_data_file ...