【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的合并果子. 好,假设你已经做过了合并 ...
随机推荐
- Vue神之大坑处理:获取通过URL的的参数不可直接操作
比如: $router.query['isZero'] == 'false'; //不会生效,刷新页面又好使了.打印处理是蓝色的false,再次刷新字体就变浅黑了. 解决:($router.quer ...
- C#调用C++数组,结构体DLL
1.基本数据类型的传递 常见数据类型的传递 C/C++ C# 长度 short short 2Bytes int int 4Bytes long(该类型在传递的时候常常会弄混) int 4Bytes ...
- GeoServer 常见问题总结 (转)
geoserver在部署发布服务时,经常会遇到如下问题,现总结如下: 1.忘记了GeoServer Web Admin Page的登陆用户名和密码怎么办?存储位置:C:\Program Files\G ...
- 阶段复习-.NET下托管资源与非托管资源的小记
托管资源由由程序员负责分配,在系统的二级缓存中,GC自动回收释放:而非托管资源也是由程序员负责分配,资源的释放回收也是由程序员负责,使用Dispose或者析构函数对资源进行回收,常见的非托管资源是包装 ...
- 《ASP.NET》数据绑定—DropDownList、ListBox
DropDownList和ListBox实现两级联动功能.他们也能够将从后台数据库中搜选的出来的信息加以绑定.这里要实现的功能是在DropDownList中选择"省",然后让Lis ...
- magento getCarriers 分析
完整的设置订单追踪信息的时候我们可能会用到它.在后台中他在这里设置: 有的时候我们想要设置自己定义的 carrier 比如 顺丰 申通 圆通 ..等等 我们能够先从 magento api 入手分析 ...
- 逆波兰法(计算器)程序<无括号版>
涉及队列.栈的运用. Java中队列可以用: Queue<String> q = new LinkedList(); 来声明,其主要的方法有: poll(),peak(),offer(), ...
- Docker---(2)为什么要用Docker
原文:Docker---(2)为什么要用Docker 版权声明:欢迎转载,请标明出处,如有问题,欢迎指正!谢谢!微信:w1186355422 https://blog.csdn.net/weixin_ ...
- 洛谷 P1551 亲戚
洛谷 P1551 亲戚 题目背景 若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系. 题目描 ...
- 【CS Round #43 B】Rectangle Partition
[链接]https://csacademy.com/contest/round-43/task/rectangle-partition/ [题意] 水题 [题解] 横着过去,把相邻的边的宽记录下来. ...