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. php学习笔记5

    PHP 常量 常量值被定义后,在脚本的其他任何地方都不能被改变. 一个常量由英文字母.下划线.和数字组成,但数字不能作为首字母出现. (常量名不需要加 $ 修饰符). 注意: 常量在整个脚本中都可以使 ...

  2. php学习笔记4

    PHP数据类型: String(字符串), Integer(整型), Float(浮点型), Boolean(布尔型), Array(数组), Object(对象), NULL(空值). 说明:var ...

  3. natapp解决Invalid Host header的问题

    最近在做一个微信公众号项目,用微信开发工具调试本地项目,需要做一下内网穿透,代理都配置好了,页面出现这个Invalid Host header错误,内网穿透工具我是用的frps做的,最后通过googl ...

  4. [React & Testing] Snapshot testings

    For example we have a React comonent: -- A toggle button, we want to test. When it si toggle on, the ...

  5. js进阶 14-7 jquery的ajax部分为什么需要对表单进行序列化

    js进阶 14-7 jquery的ajax部分为什么需要对表单进行序列化 一.总结 一句话总结:如果用ajax传递表单的数据,如果不进行表单的序列化,要一个参数一个参数的写,太麻烦,序列化的话,一句代 ...

  6. amazeui学习笔记二(进阶开发2)--Web组件简介Web Component

    amazeui学习笔记二(进阶开发2)--Web组件简介Web Component 一.总结 1.amaze ui:amaze ui是一个web 组件, 由模板(hbs).样式(LESS).交互(JS ...

  7. C++ 中的异或操作^

    好好的利用异或能够产生奇妙的效果. 异或运算的性质: 不论什么一个数字异或它自己都等于0.也就是说.假设我们从头到尾依次异或数组中的每个数字,那么终于的结果刚好是那个仅仅出现一次的数字.由于那些出现两 ...

  8. struts2_7_Action类中方法的动态调用

    (一)直接调用方法(不推荐使用) 1)Action类: private String savePath; public String getSavePath() { return savePath; ...

  9. php实现运气模型(命运随机,克服困难)

    php实现运气模型(命运随机,克服困难) 一.总结 1.应该用表格来布局的,这种多列的用表格布局比div和span布局方便很多 2.span标签设置宽度:变成行内快元素:display:inline- ...

  10. HZK16应用实例

    在C51中,HZK16汉字库的使用(mydows's Blog转载) 定义如下: unsigned char str[]="我" 个字节长度,内容为"我"的GB ...