http://wikioi.com/problem/1063/

这题是贪心+堆。主要想练习一下堆的写法。算法导论里的方法名是heapify()等,但大家经常用更直观的down(), up()方法(向上,下调整),根据这两个方法,可以有build,insert,getmin方法。

向下调整的代码稍微需要判断一下左右子树是否越界,其他都很简单。

#include <iostream>
using namespace std;
#define LEN 10005
int num[LEN];
int size; void swap(int a, int b) {
int tmp = num[a];
num[a] = num[b];
num[b] = tmp;
} void down(int i) {
if (i > size) return;
int left = i * 2;
int right = i * 2 + 1;
int minIdx = left;
if (right <= size && num[left] > num[right]) {
minIdx = right;
}
if (left > size || num[i] <= num[minIdx])
return;
else {
swap(i, minIdx);
down(minIdx);
}
} void up(int i) {
if (i == 1) return;
if (num[i / 2] > num[i]) {
swap(i / 2, i);
up(i / 2);
}
} void build() {
for (int i = size / 2; i >= 1; i--) {
down(i);
}
} int getmin() {
swap(1, size);
size--;
down(1);
return num[size + 1];
} void insert(int x) {
size++;
num[size] = x;
up(size);
} int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> num[i];
}
size = n;
build();
int sum = 0;
while (size > 1) {
int a = getmin();
int b = getmin();
sum += a + b;
insert(a + b);
}
cout << sum << endl;
}

  

[wikioi]合并果子的更多相关文章

  1. 【noip 2004】 合并果子

    noip2016结束后的第一份代码--优先队列的练习 合并果子 原题在这里 #include <iostream> #include <queue> #include < ...

  2. 合并果子 2004年NOIP全国联赛普及组

    时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆 ...

  3. NOIP2004合并果子

    题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可 ...

  4. codevs 1063 合并果子//优先队列

    1063 合并果子 2004年NOIP全国联赛普及组  时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石    题目描述 Description 在一个果园里,多多已经将所有的果 ...

  5. [KOJ6024]合并果子·改(强化版)

    [COJ6024]合并果子·改(强化版) 试题描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多把这些果子堆排成一排,然后所有的果子合成一堆.    每一次合并 ...

  6. [KOJ6023]合并果子·改

    [COJ6023]合并果子·改 试题描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多把这些果子堆排成一排,然后所有的果子合成一堆.    每一次合并,多多可以 ...

  7. [KOJ0574NOIP200406合并果子]

    [COJ0574NOIP200406合并果子] 试题描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆.    每一次合并,多多可以把两 ...

  8. NOIP提高组2004 合并果子题解

    NOIP提高组2004 合并果子题解 描述:在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消 ...

  9. 【NOIP合并果子】uva 10954 add all【贪心】——yhx

    Yup!! The problem name reects your task; just add a set of numbers. But you may feel yourselvesconde ...

随机推荐

  1. C#学习笔记10:Try-catch的用法和引用类型、值类型整理

    Try-Catch: 将可能发生异常的代码放到try中,在catch中进行捕获. 如果try中有一行代码发生了异常,那么这行代码后面的代码不会再被执行了. Try写完了以后,紧接着就要写Catch   ...

  2. react native for Android (make you first android app)

    第一步:如果你的电脑安装了node,恭喜你,第一步完成:如果没有,那请先安装node. 第二步:安装react-native-cli,在windows下需要从github签下来的react-nativ ...

  3. Dorado事件的参数

    onClick,onSuccess 事件一般只有2个参数(self,arg),其实参数是可以添加的.可以把控件的ID直接放到参数里面来,然后在事件编辑里直接通过ID作控件对象,直接设值就好了,不要输入 ...

  4. enum 与 #define

    enum 与 #define 一.为什么既要有enum,又要define enum is derived from enumerate, from ex- + number,字面意思就是用数字排列,报 ...

  5. poj 3565 uva 1411 Ants KM算法求最小权

    由于涉及到实数,一定,一定不能直接等于,一定,一定加一个误差<0.00001,坑死了…… 有两种事物,不难想到用二分图.这里涉及到一个有趣的问题,这个二分图的完美匹配的最小权值和就是答案.为啥呢 ...

  6. OpenJudge/Poj 1723 SOLDIERS

    1.链接地址: http://bailian.openjudge.cn/practice/1723/ http://poj.org/problem?id=1723 2.题目: 总时间限制: 1000m ...

  7. MySQL基础学习之开始

    学习MySQL数据库几个月了,从什么都不懂到现在这个地步,说实话感触很大,也感觉自己有许多不足之处.当接触MySQL的时候, 连创建一个数据表都想了很长的时间,不知道许多东西.幸亏我有一个好的老师,她 ...

  8. 如何让sudo命令不需要输入密码就可执行

    通过visudo 来编辑/etc/sudoers来实现 在该文件中追加一下记录即可 username ALL=(ALL) NOPASSWD:ALL ——-下面文章转载自网络———– # User pr ...

  9. SQL技术内幕四

    数据类型: sql server只接受两种数据类型 1. 普通字符 varchar char 用一个字节表示一个字符,表示英文 2.unicode   nchar nvarchar 用两个字节表示一个 ...

  10. C指针笔记

    指针的学习 两个数比较大小,通过传递内容进行比较 #include <stdio.h> void swap(int *p1, int *p2){ int temp; //注意指变量*的两个 ...