上一页 1 2 3 4 5 6 ··· 8 下一页
  2011年10月20日
摘要: //线段树的节点//节点包括两部分信息,基本域,和信息域//基本域:左右边界ld,rd. 左右孩子:lc,rc//信息域:key值,如RMQ问题中,信息域中存储的是区间最大值struct Node{ int ld,rd; Node *lc,*rc; int key;};//空树的建立,内含key值的初始化;//一般在主函数中首先调用 Node* root= buildtree(1,n);建立一棵新树Node *buildtree(int a,int b){ Node * p=new Node;//给P申请一块内存 p->ld=a; p->rd=b; //{初始化 p->key 阅读全文
posted @ 2011-10-20 19:05 geeker 阅读(2226) 评论(0) 推荐(0) 编辑
摘要: 给定k个序列s1,s2,s3,...,sk,用二路合并方法将k个序列合并为一个。假设将任意两个长度分别为n和m的序列合并为一个需要的代价是m+n-1,设计一个算法来确定合并这些序列的合并为一个的最大代价和最小代价。#include<iostream>using namespace std;void swap(int &a ,int &b){ int temp=a; a=b; b=temp;}//返回数组arr[]的最大值void maxSink(int arr[],int n,int i){ int child; int j=i; while(j<=n/2){ 阅读全文
posted @ 2011-10-20 16:07 geeker 阅读(1458) 评论(1) 推荐(0) 编辑
  2011年10月17日
摘要: 在竞赛中经常涉及到一些以字符串为键值的操作,此情况下用map映射比较好.打一个最简单的比如,十个小孩互相给对方糖,问经过若干次操作之后问他们每一个人手头里有多少糖。其中一个操作,小红给小明小刚分别五块糖。如果采取普通的数据结构,比如struct{string name,int candy};那么还得经过一次循环查找谁叫小明,找到小明之后,在对其相应的糖块数进行修改。当然如果如果用二分查找的话,肯定会效率高一些,但是对于一个小小的且经常用的操作就写一大堆多余代码,肯定会增加程序的易错性。我觉得STL里面的set内部的实现应该是二分的,封装的不错,很容易操作,我们直接用,何乐而不为。#includ 阅读全文
posted @ 2011-10-17 16:52 geeker 阅读(396) 评论(0) 推荐(1) 编辑
  2011年10月16日
摘要: http://poj.org/problem?id=1141这是一道典型的动态规划题目,过去做过类似的,如POJ3391,思路几乎一摸一样,但是这道题目唯一比较讨厌的地方就是,得构造出最终的最优解,就是得显示出最优解的摸样,本来想通过做标记的方式,把DP的路径记录下来,后来感觉很麻烦,于是又加了一个bestStr[][]数组,元素类型是string,把每一个状态的形态记录了下来,bestStr[0][n-1]即是最优解,但是这样够早的话,可能附加操作比较多,因为每次都涉及很多字符串衔接的操作,导致最终居然超时。。。有时间,换一个方法实现以下好了,不用记忆搜索,换成循环递归实现以下,看看是否能摆 阅读全文
posted @ 2011-10-16 23:47 geeker 阅读(775) 评论(1) 推荐(1) 编辑
摘要: http://poj.org/problem?id=1988看黑书看到并查集,练了一道并查集的题目,很典型,不是很难,但是细节上的处理还是比较容易出错的。理解题意之后,首先对状态进行建模。分别建立三个数组,意义如下int father[i];//记录 i 的父亲节点,注意不一定是根节点,路径压缩之后才一定是根节点int total[i];//记录集合中元素个数,仅当i为根节点该值才有意义int deep[i];//每棵树距离父亲的距离,注意不是根树,所以每次进行路径压缩压缩的时候,将原父亲改为根节点时不要忘记将深度值也同时进行修改如果输入为Mi j 那么就调用合并函数unin(i,j)如果输入 阅读全文
posted @ 2011-10-16 01:26 geeker 阅读(225) 评论(0) 推荐(0) 编辑
  2011年10月12日
摘要: 该题,对题目的理解是关键。。。(好恶心)http://poj.org/problem?id=2586题意:有一个公司由于某个病毒使公司赢亏数据丢失,但该公司每月的赢亏是一个定数,要么一个月赢利s,要么一月亏d。现在ACM只知道该公司每五个月有一个赢亏报表,而且每次报表赢利情况都为亏。在一年中这样的报表总共有8次(1到5,2到6,…,8到12),现在要编一个程序确定当赢s和亏d给出,并满足每张报表为亏的情况下,全年公司最高可赢利多少,若存在,则输出多多额,若不存在,输出"Deficit"。分析:在保证连续5个月都亏损的前提下,使得每5个月中亏损的月数最少。 x=1: ssss 阅读全文
posted @ 2011-10-12 19:45 geeker 阅读(726) 评论(0) 推荐(0) 编辑
摘要: 练习枚举方法,网上推荐做POJ1753,感觉似曾相识,不管,就做了,后来才发现,这道题目,过去做过,不过过去用的是DFS方法,其实两种方法都不错,都属于基本算法,而且模拟操作也适合基础练习。模拟的话应该应该建立两个矩阵initMap[][],ope[][], (因为每次枚举都要初始化棋盘所以,每次拷贝棋盘到map[][]上,在map[][]上进行操作修改。)假设map[i][j]=1则为黑色,map[i][j]=0为白色每次枚举ope[][]矩阵的第一行ope[1][j],共有16中情况{0,0,0,0},{0,0,01}.....{1,1,1,1}可以发现一个规律,如果从上到下,从左到右填写 阅读全文
posted @ 2011-10-12 17:41 geeker 阅读(664) 评论(0) 推荐(0) 编辑
  2011年10月10日
摘要: 这是算法课程上完分之策略后老师留的一道题目:菲波那契数列如下:1,1,2,3,5,8,13,21,34......其中a[1] = 1, a[2] = 1, a[n]=a[n-1]+a[n-2](n>=3)。对给定的下标n,求解a[n]%1997的值.其中测试数据n是整数范围内。这个题目,主要是用到很关键的一个数学知识,斐波那契数列的求法,可以转换为矩阵的连乘,矩阵的n此方算法又可以用分治的算法。而且又有理论依据:(n*m)%c=[ (n%c)*(m%c) ]%c ; (n+m)%c=[ (n%c)+(m%c) ]%c ,所以过程中的结果可以随时取模,而不影响最终的结果关于斐波那契数列的 阅读全文
posted @ 2011-10-10 01:06 geeker 阅读(3320) 评论(0) 推荐(1) 编辑
摘要: 最初没有多想,直接用最基本的DP写的代码,本想水过,可是测试数据超时。。。DP O(n*n)算法代码:#include<iostream>using namespace std;int main(){ const int SIZE = 1005; int dp[SIZE]; int arr[SIZE]; int n; while(cin>>n&&n!=0){ int max = 1; for(int i=1;i<=n;i++){ cin>>arr[i]; dp[i]=1; ... 阅读全文
posted @ 2011-10-10 00:57 geeker 阅读(557) 评论(0) 推荐(0) 编辑
  2011年10月6日
摘要: 斐波那契序列 集锦 (转)[定理1] 标准Fibonacci序列(即第0项为0,第1项为1的序列)当N大于1时,一定有f(N)和f(N-1)互质其实,结合“互质”的定义,和一个很经典的算法就可以轻松证明对,就是辗转相除法互质的定义就是最大公约数为1数学归纳法是很有用的证明方法,我们接下来这个定理用数学归纳法就很好证明:[定理2]若i为奇数, f(i)*f(i)=f(i-1)*f(i+1)+1,否则f(i)*f(i)=f(i-1)*f(i+1)-1对,这个定理用数学归纳法可以轻松证明,大家有兴趣可以自己尝试[定理3] f(n)=f(i)*f(n-i-1)+f(i+1)*f(n-i)f(n)=f( 阅读全文
posted @ 2011-10-06 02:37 geeker 阅读(1767) 评论(0) 推荐(0) 编辑
上一页 1 2 3 4 5 6 ··· 8 下一页