2011年7月28日

poj-1505 Copying Books ***

摘要: /* * DP * d[i][j] : 前i个人,分完1~j本书,d值满足:minimize the maximum number of pages assigned to a single scriber * d[k][m]即为所求 * * 状态转移方程:d[i][j] = min( max(d[i-1][t] , page[j] - page[t]) ) 其中: i-1 <= t <= j-1 (注意每个人至少一本书) * 其中 page[i] 为 1~i本书的总页数, page[j]-page[t] 即为第j个人分到的页数 * * 最后注意满足 “If there is mo 阅读全文

posted @ 2011-07-28 17:56 龙豆 阅读(491) 评论(0) 推荐(1)

算法导论-9.3-7

摘要: 【转】题目:给出一个O(n)时间的算法,在给定一个有n个不同数字的集合S以及一个正整数k<=n后,它能确定出S中最接近其中位数的k个数。——————————算法思想:1.找到数组a中第n/2小的数median;2.对a中非median数进行|a[i] - median|,得到一个大小为n - 1的数组distance;3.寻找distance中第k小的数值;4.对distance进行一次遍历,找到小于等于k的数,从而对应得到数组a中的k个数。上述每一步的时间复杂度都为O(n),因而最后总的时间复杂度为O(n).#include <iostream>#include <t 阅读全文

posted @ 2011-07-28 12:06 龙豆 阅读(391) 评论(0) 推荐(0)

2011年7月27日

poj-1042 Gone Fishing **

摘要: /* 贪心+优先级队列 * * 贪心:为了不讨论在路上花费的时间,可以枚举到过的湖:比如:totLake=j 表示 到过湖1、2、..、j 相应的, 花在路上的时间 * 就是 t[1]+t[2]+..+t[j-1] (显然每段路只会走一次) 于是算出leftTime,表示花在钓鱼上的时间 * 这样一来,就不同再考虑路上的时间了,可以认为John有瞬间移动,哪个湖鱼多,就到哪个湖钓(当然 湖的编号 满足 1 <= ~ <=totLake ) * * 于是可以用一个优先级队列,每次到与最多的湖钓, * 还要注意的是,如果某时刻有多个湖有同样多的鱼,则到湖编号最小的那个湖里钓!!(只要对 阅读全文

posted @ 2011-07-27 22:33 龙豆 阅读(1023) 评论(0) 推荐(0)

算法导论-15-7 达到最高效益的调度

摘要: 【转】问题:假设有一台机器,以及在此机器上处理的n个作业a1,a2,...an的集合。每隔作业aj有一个处理时间tj,效益pj,以及最后期限dj。机器在一个时刻只能处理一个作业,而且作业aj必须在tj连续时间单位内不间断地运行。如果作业aj在最后期限dj之前完成,则获得效益pj,但如果在最后期限之后才完成,则没有效益。请给出一个动态规划算法,来寻找能获得最大量效益的调度,假设所有的处理时间都是1到n之间的整数。——————————分析:其实这个问题类似于01背包问题。1. 将a1,a2,…,an按照dj值排序,从小到大。假设接下来的分析中,已经保证当i<j时,di<dj。添加d0= 阅读全文

posted @ 2011-07-27 10:45 龙豆 阅读(3581) 评论(2) 推荐(0)

算法导论-15.5-4

摘要: Exercises 15.5-4 Knuth has shown that there are always roots of optimal subtrees such that root[i,j-1]<=root[i,j]<=root[i+1,j] for all 1<=i<=n. Use this fact to modify the OPTIMAL-BST procedure to run in Θ(n^2) time.—————————————————————————————————————————————————— First prove this fact 阅读全文

posted @ 2011-07-27 09:36 龙豆 阅读(1472) 评论(0) 推荐(0)

2011年7月21日

红黑树实现

摘要: /* * RED-BLACK-TREE * */#include <cstdio>using namespace std;const int MAXN = 10000;const int RED = 0, BLACK = 1, ROOT = 0;struct SData{ int key, color; SData *left, *right, *p;};SData *rbtree[MAXN];SData *nil = new SData;void ini(){ nil->color = BLACK; rbtree[ROOT] = nil;}SData *rb_minimum 阅读全文

posted @ 2011-07-21 21:37 龙豆 阅读(523) 评论(0) 推荐(1)

poj-3349 Snowflake Snow Snowflakes *

摘要: /* * hash。。 链表法 * 3349.cpp * * 需注意如何判断两个雪花一样 * 看数据: * 1 1 2 0 0 0 * 1 1 0 0 0 2 * * Created on: 2011-7-21 * Author: */#include <cstdio>using namespace std;const int MAXN = 100000 + 5;int n;bool vis[MAXN] = {};struct SData{ int a[6]; SData *pre, *next;};SData *table[MAXN];SData snow[MAXN];//相加 阅读全文

posted @ 2011-07-21 18:14 龙豆 阅读(325) 评论(0) 推荐(0)

poj-2418 Hardwood Species *

摘要: /* * 二叉查找树练习 * 2418.cpp * * Created on: 2011-7-21 * Author: */#include <cstdio>#include <cstring>using namespace std;const int maxs = 10000 + 5;const int ROOT = 0;struct SData{ char name[35]; int num; SData *left, *right; SData(): num(0), left(NULL), right(NULL) {}};SData *tree[maxs];int 阅读全文

posted @ 2011-07-21 17:07 龙豆 阅读(317) 评论(0) 推荐(0)

2011年7月20日

Splay树简介

摘要: 【转】计算机算法和数据结构中,有各种多样的树,比如AVL树,红黑树,B+树等等,这几种树主要的主要目的是尽量保持平衡,保证即使在最坏情况下,时间复杂度是O(logN),也就是说,从根节点到最底层的叶子节点,路径不会相差太远。比如B+树,它通过节点的分裂来保持尽量平衡,而且这种树比较散,高度不高,访问路径都比较短,比较适合在数据库中作索引。但是今天我要说一说splay树,我不知道中文叫什么名字,也许该叫它“变根树”。Splay树与众不同的是:它并不一味追求平衡,而是追求整体的效率。当一个节点被访问以后,通过树的旋转,这个节点被移动到最上层,成为新的根节点。旋转以后,这棵树有可能变得很不平衡。但是 阅读全文

posted @ 2011-07-20 21:24 龙豆 阅读(1861) 评论(0) 推荐(1)

AVL树

摘要: ZhangFei 12.00 Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE MicrosoftInternetExplorer4 【转】数据结构学习(C++)——平衡二叉树(AVL树)这个恐怕是整个《数据结构》教科书里面最难的和最“没用”的数据结构了(现在的教科书还有部分算法内容)。说它没用,恰恰是因为它太有用——有着和普通的二 叉搜索树完全一样的接口界面,绝大多数情况下比普通的二叉搜索树效率高(很多)。因此,通常情况下,人们都是一劳永逸的——写完后就重用,而不会再写了。 所以说,你虽然学完了平衡二叉树,但很可能你永远也不会亲. 阅读全文

posted @ 2011-07-20 20:59 龙豆 阅读(1400) 评论(0) 推荐(1)

导航