2012年3月30日

判断两个二叉树是否同构(相似)

摘要: 题目: 给出两个二叉树的根结点,判断这两个二叉树是否同构,同构即表示两棵树形状形式,只是value不同而已。 直接递归判断。bool _istongG(Node* t1, Node* t2){ if(NULL == t1 || NULL == t2) return (NULL == t1) && (NULL == t2); return _istongG(t1->left, t2->left) && _istongG(t1->right, t2->right);} 阅读全文

posted @ 2012-03-30 13:24 buptLizer 阅读(6951) 评论(0) 推荐(0) 编辑

判断二叉树是否是完全二叉树

摘要: 题目: 给出一个二叉树,判断是否是完全二叉树。分析:我们都知道完全二叉树是指最后一层左边是满的,右边可能慢也不能不满,然后其余层都是满的,根据这个特性,利用层遍历,如果我们当前遍历到了NULL结点即叶结点,那么后续如果还有非叶结点,就说明是非完全二叉树,所以利用队列,代码比较简单了。View Code bool is_completeTree(Node* r){ queue<Node*> q; if(NULL != r) { q.push(r); Node* cur = NULL; bool flag = false; ... 阅读全文

posted @ 2012-03-30 13:21 buptLizer 阅读(8100) 评论(0) 推荐(0) 编辑

2012年3月11日

素数-简单题

摘要: 1.素数筛选法模板:View Code /* *@brief 初始化素数数组 */void init_prime(){ memset(is_prime, true, sizeof(is_prime)); //筛掉偶数 for(int k = 4; k < maxn; k +=2) { is_prime[k] = false; } int sq = (int)sqrt((double)maxn); //筛掉素数的倍数 for(int i = 3; i <= sq; ++i) { if(is_prime[i]) ... 阅读全文

posted @ 2012-03-11 11:57 buptLizer 阅读(882) 评论(0) 推荐(0) 编辑

2011年12月3日

poj2002 poj3432 正方形个数 (hash,二分)

摘要: 给出一堆点,求其中正方形的个数。题目很简单,如果枚举,复杂度为O(n^4),肯定超时,我们利用hash,或者二分来降低复杂度,枚举其中的两个点,然后利用正方形的性质求出其余的两个点,然后判断这两个点是否都存在,如果存在,说明可以组成一个正方形。判断的方式利用hash或者二分都可以,这个题目用的hash,poj3432用的二分。下面的问题就是给出两个点,如何求出其余的两个顶点。给出两个点(a1,a2),(b1,b2),我们得到其余两个顶点为(a1+(b2-a2),a2-(b1-a1)),(b1+(b2-a2),b2-(b1-a1)),或者(a1-(b2-a2), a2+(b1-a1)),( b1 阅读全文

posted @ 2011-12-03 16:58 buptLizer 阅读(1086) 评论(0) 推荐(0) 编辑

2011年11月15日

置换群

摘要: 看了几天置换群,一直没搞清楚定义是怎么回事,一个置换可以写成若干循环的乘积,那么如果置换求幂的话,一个循环不会跑到另一个循环里面去。我们可以简单理解为这几个位置的数来回换。poj3270给出一列数,求将这列数排成升序的最小花费,这里花费定义为交换两个数的和。例如给出一排数8 4 5 3 2 7,那么我们最终的状态为2 3 4 5 7 8,这里的轮换有(8 2 7)(4 5 3),这里8应该在第六个位置,而第6个位置是7,7应该在5这个位置,而第5个位置为2,2应该在1这个位置,这样就到了8所在的位置,我们称这是一个轮换。首先需要明确的一点是对于每个群,假设有k个数,那么我们需要交换k-1次得到 阅读全文

posted @ 2011-11-15 12:07 buptLizer 阅读(7497) 评论(0) 推荐(1) 编辑

2011年11月10日

poj3983 (24点)

摘要: 给出4个数,只能添加+-*/或者()使得结果为24。思路:枚举,一共5*3^4.#include <iostream>using namespace std;double a,b,c,d;double f(double a,double b,int op){ if(1 == op) return a+b; if(2 == op) return a-b; if(3 == op) return a*b; return a/b;}//type表示加括号的方式,一共5种bool caculate(int p1,int p2,int p3,int type){ double ans=0.0; 阅读全文

posted @ 2011-11-10 21:56 buptLizer 阅读(794) 评论(0) 推荐(0) 编辑

poj1995快速幂取余

摘要: 快速幂运算:View Code int pow(int a,int n){ int rs=1; while(n) { if(n&1) rs=rs*a; a=a*a; n=n>>1; } return rs;}快速幂取余://求a^b%n,O(logb)__int64 get_mi_mod(__int64 a,__int64 b,int n){ if(0 == a) return 0; if(0 == b) return 1; __int64 rs=1; while(b) { if(b&1) rs=(rs*a)%n; a=(a*a)%... 阅读全文

posted @ 2011-11-10 15:01 buptLizer 阅读(1105) 评论(1) 推荐(0) 编辑

2011年11月8日

poj3714 最近点对

摘要: 最近点对,采用分治方法。过程:1对原数组依据x左标从小到大排序。2二分数组,左边求出最小值,右边求出最小值,我们求最小的。3找出对于左右两边的可能小于当前最小值的最近点对,更新最小值。这题目需要区分一下点,让我们求的是闪兵到任意一个核电站的最短距离,加一个标志就可以了。代码:#include <iostream>#include <stdio.h>#include <iomanip>#include <algorithm>#include <cmath>using namespace std;const int N=200000+1; 阅读全文

posted @ 2011-11-08 16:42 buptLizer 阅读(2943) 评论(0) 推荐(0) 编辑

poj2079 求最大的三角形面积

摘要: 这个题说给出一堆点,求最大的三角形面积。我们知道这三个点肯定在凸包上,我们求出凸包之后不能枚举,因为题目n比较大,枚举的话要O(n^3)的数量级,所以采用旋转卡壳的做法:首先确定i,j,对k进行循环,知道找到第一个k使得cross(i,j,k)>cross(i,j,k+1),如果k==i进入下一次循环。对j,k进行旋转,每次循环之前更新最大值,然后固定一个j,同样找到一个k使得cross(i,j,k)>cross(i,j,k+1)。对j进行++操作,继续进行下一次,知道j==k为止。关键代码:void rotating_calipers(){ double ans=0.0,are; 阅读全文

posted @ 2011-11-08 16:41 buptLizer 阅读(675) 评论(0) 推荐(0) 编辑

poj2187 最远点对问题

摘要: 这个题用旋转卡壳做的,对于问题规模比较大时就可以体现出来他的优势了。凸包上的点依次与对应边产生的距离成单峰函数,我们首先固定一条边,然后找到第一个k,使得(i,j,k)的叉积<(i,j,k+1)的叉积,这时更新最大值,然后枚举下一个边,这个复杂度是O(n)的,因为我们逆时针枚举边的时候,k也是逆时针变化的。关键代码:void rotating_calipers(){ int ans=0,d1,d2; int i,k; s[top+1]=s[0]; k=1; for(i=0;i<=top;++i) { while(cros(s[i],s[i+1],s[k])<cros(s[i] 阅读全文

posted @ 2011-11-08 16:40 buptLizer 阅读(570) 评论(0) 推荐(0) 编辑

导航