【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的合并果子. 好,假设你已经做过了合并 ...
随机推荐
- 【例题 8-4 UVA - 11134】Fabled Rooks
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 显然把问题分解成两个子问题. x轴和y轴分别做. 即n个点要求第i个点在[li,ri]范围内.(ri<=n) 问是否可行. 按 ...
- C++ 指针与引用 知识点 小结
[摘要] 指针能够指向变量.数组.字符串.函数.甚至结构体.即指针能够指向不同数据对象.指针问题 包含 常量指针.数组指针.函数指针.this指针.指针传值.指向指针的指针 等. 主要知识点包含:1. ...
- 语音识别系统:有免费实用的"语音到文字"的软件么?
自从看了<李开复自传>,就对"语音识别系统"产生了非常深刻的印象. 根据自己的判断,语音识别系统还是非常有用的. 以自己的实际需求来看: 1.中国象棋中的应用. 中国象 ...
- ArcGIS 10.5 新功能
ArcGIS 10.5正式发布,打造智能的Web GIS平台 2017年新年来临之际,ArcGIS 10.5正式发布. 历经几个版本,ArcGIS10.5已经革新为一个智能的以Web为中心的地理平台, ...
- jquery如何实现表单post方式提交
jquery如何实现表单post方式提交 一.总结 一句话总结:即使js给form对象提供了submit()方法,那也不意为表单中可以不写提交按钮这个元素,即form表单依然需要五脏俱全才可以使用js ...
- windows下安装emscripten
windows下安装emscripten windows下安装emscripten需要python.git环境 python安装 git安装 开始安装 # 1.克隆emsdk git clone ht ...
- 9.8 Binder系统_c++实现_内部机制1
1. 内部机制_回顾binder框架关键点 binder进程通讯过程情景举例: test_server通过addservice向service_manager注册服务 test_client通过get ...
- 6.4 Android硬件访问服务编写HAL代码
JNI向上提供本地函数,向下加载HAL文件,并调用HAL的函数: HAL负责访问驱动程序执行硬件操作 JNI和HAL都是用c语言或者C++语言编写的,JNI加载HAL的实质就是使用dlopen加载动态 ...
- Win10系统如何设置所有程序默认以管理员身份运行?
原文:Win10系统如何设置所有程序默认以管理员身份运行? 在win10系统中有些用户发现一些程序只有使用管理员身份运行能才打开,这样的话就感觉会麻烦很多,那么有没有办法设置所有程序都默认以管理员身份 ...
- Java抽象类中的抽象方法的参数对应的子类的方法的参数必须一致吗?
同学你这个涉及了两个概念. 一个是抽象方法,一个是方法重载. 先说下概念: 抽象方法就是abstract描述的方法,它本身不含实现,必须由子类实现. 方法重载则是同一个方法名,但是参数类型或者参数个数 ...