其实这个题完全不需要用手写堆,只需要一遍遍sort就行了……

但是!

为了练习手写堆,还是用手写堆做了。

在做本题之前,如果你没有什么思路的话,建议先做Luogu的合并果子

好,假设你已经做过了合并果子了。那么正式开始本题:

相信许多人都已经知道了这道题就是合并果子,但是还不知道它是怎样转化成合并果子的,其实很简单:比如说9 7 6 5 3,有些同学可能会想:每次我砍最大的,然后剩下的不就少了。其实不然,因为不一定一次只能砍一个,可以砍两个或两个以上。不多说,我把上面例子的最优策略讲出来大概就知道了。step1:把9+7+6+5+3切成7+6和5+3+9两部分;step2:把7+6切成7和6;step3:把5+3+9切成5+3和9两部分:step4:把5+3切成5和3。这时我们再回过头来看,是不是就是合并果子的步骤?

AC代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
long long x,n,tot,dl[],sum;//小根堆
char c;
void delete_2(long long num)
{
if(((num<<)+)<=tot)
{
if(dl[num<<]<dl[(num<<)+])
{
if(dl[num]<dl[num<<])
return ;
else
{
swap(dl[num],dl[num<<]);
delete_2(num<<);
}
}
else
{
if(dl[num]<dl[(num<<)+])
return ;
else
{
swap(dl[num],dl[(num<<)+]);
delete_2((num<<)+);
}
}
}
else
{
if((num<<)<=tot)
{
if(dl[num]<dl[num<<])
return ;
else
{
swap(dl[num],dl[num<<]);
delete_2(num<<);
}
}
else
return ;
}
return ;
} void delete_1()//删除操作
{
dl[]=dl[tot--];
delete_2();
} void qcr(long long num) //名字随便取的
{
if(num==)
return ;
if(dl[num]<dl[num>>])
{
swap(dl[num],dl[num>>]);
num>>=;
qcr(num);
}
return ;
} void putin(long long x) //添加操作
{
dl[++tot]=x;
qcr(tot);
} void putout() //读取操作
{
printf("%d",dl[]);
return ;
} int main()
{
ios::sync_with_stdio(false);
cin>>n;
for(int i=;i<=n;i++)
{
cin>>x;
putin(x);
}
for(int i=;i<n;i++)
{
int q,p;
q=dl[];
delete_1();
p=dl[];
delete_1();
sum+=p+q;
putin(p+q);
}
cout<<sum;
return ;
}

Luogu [P1334] 瑞瑞的木板(手写堆)的更多相关文章

  1. 手写堆优化dijkstra

    \(dijkstra\) 算法的堆优化,时间复杂度为\(O(n+m)\log n\) 添加数组\(id[]\)记录某节点在堆中的位置,可以避免重复入堆从而减小常数 而这一方法需要依托手写堆 #incl ...

  2. spfa+剪枝 或者 dij+手写堆+剪枝 UOJ 111

    http://uoj.ac/problem/111 好像NOIP里面的题目...有好多都是...能通过xjbg剪枝来...AC题目的? 得好好学一下这些剪枝黑科技了... 思路:我觉得这位大佬说的很完 ...

  3. AC日记——手写堆ac合并果子(傻子)

    今天整理最近的考试题 发现一个东西叫做优先队列 priority_queue(说白了就是大根堆) 但是 我对堆的了解还是很少的 所以 我决定手写一个堆 于是我写了一个简单的堆 手写的堆说白了就是个二叉 ...

  4. hihoCoder 第136周 优化延迟(二分答案+手写堆)

    题目1 : 优化延迟 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho编写了一个处理数据包的程序.程序的输入是一个包含N个数据包的序列.每个数据包根据其重要程度不同 ...

  5. [转载] 管Q某犇借的手写堆

    跟gxy大神还有yzh大神学了学手写的堆,应该比stl的优先队列快很多. 其实就是维护了一个二叉堆,写进结构体里,就没啥了... 据说达哥去年NOIP靠这个暴力多骗了分 合并果子... templat ...

  6. BZOJ 1975 魔法猪学院(A*+手写堆)

    1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 1941  Solved: 595 [Submit][Sta ...

  7. 手写堆_C++

    一般主程序中拿堆顶元素 x=h[]; h[]=h[top--]; down(); 在堆尾加入元素 h[++top]=x; up(top); 上浮下沉操作 inline void up(int x) { ...

  8. 手写堆的dijkstra

    颓废.. #include <cstdio> #include <cstring> #include <algorithm> using namespace std ...

  9. C++STL手写版

    手写STL,卡常专用. node为变量类型,可以自由定义,以下不再赘述. 1.stack(栈) 开一个数组,和一个top指针,压栈时++,弹栈时--即可. struct stack{ int tp;n ...

随机推荐

  1. Asp.net Core 创建控制器时出错问题记录(运行所选代码生成器时出错)

    问题描述:在创建一个MVC控制器(带读写,使用EF) 解决方法:添加nuget包

  2. 手动添加git 到 右键菜单

    1.通过在“运行”中输入‘regedit’,打开注册表. 2.找到[HKEY_CLASSES_ROOT\Directory\Background]. 3.在[Background]下如果没有[shel ...

  3. Luogu P3391 文艺平衡树(Splay or FHQ Treap)

    这道题要求区间反转...好东西.. 对于Splay:把l-1旋到根,把r+1旋到根的右儿子,这样r+1的左儿子就是整个区间了,然后对这个区间打个tg 注意要插-Inf和Inf到树里面,防止越界,坐标要 ...

  4. ACM-ICPC 2018 南京赛区网络预赛 B. The writing on the wall (暴力)

    题意:一个n*m的方格矩阵,有的格子被涂成了黑色,问该矩阵中有多少个子矩阵,子矩阵不包含黑色格子; 思路:对于一个长为L, 高为H的无黑点矩阵中包含的高为H的子矩阵个数为L+(L-1)+(L-2)+. ...

  5. Django - 回顾(1)- 模型层的Meta选项详解

    一.模型层的Meta选项详解 Django模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性.使用方法及参数解释如下: class Book(models.Model): nid ...

  6. Jmeter4.0---- HTTP请求默认值(15)

    1.说明 在线程组中,添加”HTTP请求默认值”,并填写 协议,服务器名称/IP ,端口号,编码等 ,之后该线程组中的所有请求,可以不用填写这几项,启动后会直接调用”HTTP请求默认值”中的数据,方便 ...

  7. spring boot(10) 基础学习内容

    A Spring boot(10) 基础学习内容 B SpringBoot(16) 基础学习内容

  8. strcpy、strncpy、strlen、memcpy、memset、strcat、strncat、strcmp、strncmp,strchr

    1.strcpy #include<stdio.h> #include<assert.h> char *mystrcpy(char *dest, const char *src ...

  9. Python 类总结

    Python可以继承多个父类,多重继承. 类支持多个对象的产生,命名空间的继承,运算符重载1).类产生多个实例对象Python OOP模型中的两种对象:类对象和实例对象.类对象提供默认的行为,是实例对 ...

  10. 通过Maven管理多个MapReduce项目

    1. 配置Maven环境 首先检查Windows是否配置了maven,进入cmd命令行,输入mvn -version命令,如果出现下图所示的 情形则表示满意配置maven. 从浏览器进入maven官网 ...