摘要:
如何快速求出区间范围[0,x]内的素数?Brute Force 总是那么的让人觉得亲近。枚举每一个数,判断该数是否为素数?bool isPrime( int x ) { if(x < 2) return 0; if(x == 2) return 1; for ( int i=2; i*i<=x; ++i ) if(0 == x%i) return 0; return 1;} // 用prime[0]存素数个数for ( int i=0; i<=x; ++i ) if( isPrime(i) ) prime[++prime[0] ] = i;暴力解决问题在很多... 阅读全文
摘要:
编程之美这本书还是挺不错的,很多分析问题的方法都是让人受益的。算了废话什么的就不讲了。如何求解区间[x,y]内数字1出现的次数? 看看数据我就泪奔了。。。yy了一下就直接看解答了。这么这么长,烦人啊。还是自己想想吧!呵呵,果断会想数位DP啊。然后就写,debug。结束。找了oj提交? wa? wa?肿么回事呢?不会出错啊,写了个暴力的代码对拍,没有问题啊。正常数据,边界数据都测试过了。No Problem。给问题板块发了分报告。。。继续检查。。。算了吃饭去了。。。。回来又是debug,真心没错啊。。提交,编译中,测试中。。ac。这是哪门子事啊。 当时就有一种很坑的感觉,浪费了我一下午啊。我的解 阅读全文
摘要:
The Stable Marriage ProblemDescriptionThe stable marriage problem consists of matching members of two different sets according to the member’s preferences for the other set’s members. The input for our problem consists of:a set M of n males;a set F of n females;for each male and female we have a lis 阅读全文
摘要:
最小环问题:求个图中环路径代价最小的回路。如何求最小环?假如有 路径1->3->2,如果此时已经知道2-1的最短路径就好了。 回想下floyed的更新过程,就会发现更新第k次时,比k小的点之间都是最短距离的(要是点是联通的话)。所以给出解法:第k次更新图时,枚举和k相连的两条边。如 环路代价 = dist[i][k] + dist[k][j] + dist[j][i];求无向图中最小环的个数,先算出一个最小环代价,把之后算出的环代价与之对比更新就可以了。这个图中是求不同的最小环的个数,所以重边是没有影响的fzu 2090 http://acm.fzu.edu.cn/problem. 阅读全文
摘要:
hdoj 1175http://acm.hdu.edu.cn/showproblem.php?pid=1175这题是简单的搜索,给图图中的两个位置,问这两个位置是否可以消去。有以下情况不能消去:1,起点和终点有任意一个是非法点,即不是图中的点;2,起点和终点有任意一个是数值为0的点,即该点事空的。3,起点和终点的数值不相同。4,起点和终点的最短距离大于2,这个最短距离是指转弯的次数。前3点都是直接可以处理的,对于第四点我是采用bfs搜的。记录当前节点的方向和转弯次数即可。在hdoj c++ 提交 跑了109ms, 弱啊 !View Code 1 // 用node记录上一次的方向,但是结束条件. 阅读全文
摘要:
按位dp:对于当前长度i是枚举该为的值(0~10),统计出区间内合法的数;下面是基础入门的3题;hdoj 2089http://acm.hdu.edu.cn/showproblem.php?pid=2089区间数内不包含4和62的数的个数View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 7 8 int num[10][10]; 9 10 // 预处理长度为i 阅读全文
摘要:
大根堆: 根节点value不小于子节点的value,满足这条性质的二叉树即为大根堆。小根堆:根节点value不大于子节点的value,满足这条性质的二叉树即为小根堆。从大根堆的定义可知:在大根堆里要得到最大值只需o(1)的时间。所以很明显,大根堆可以求最大值和维护前k小的数。注意是前k小的数,不是前k大的数,因为当前要插入到堆里的数可以直接和堆里最大值考虑,如果比堆里最大的都还要小,那就那这个值放到堆里,这样就维护了前k小的数。如果k很大的话,要划分为很多个堆。小根堆和大根堆相反。堆的操作主要有:bool isEmpty(int *a); // 判断堆是否为空bool isFull(int * 阅读全文
摘要:
归并排序: 归并排序是每次都把有序的区间合并起来构成一个新的有序序列。初始时区间长度是1;模拟求解时: 区间段数是n。每次最后那段都合并到前一段上。 递归求解: 只要注意边界就好了,left>=right就递归结束返回程序上一层。总的时间复杂度为0(nlogn),空间复杂度为0(n);代码一:模拟合并区间View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 阅读全文
摘要:
插入排序: 算法和字面意思是一样的,对于当前元素a[now],在a[1]到a[now]的位置中找一个位置给a[now].因为a[1]到a[now-1]的数据是有序的,所以在插入a[now]后,序列仍是有序的。算法时间复杂度为 o(Σ(i))=o(n*n) (1<i<=n),这是最坏情况下的时间复杂度; 空间复杂度为o(1); 实现很简单,当表中数据很少时,这会是一个不错的选择。代码:View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include 阅读全文