博文

目前显示的是 五月, 2009的博文

递归+回朔,超级好的题目ZOJ1002/HDU1045

1、棋盘问题,如果要用递归,最好是用一维数组来传递参数。 2、注意截止条件的运用。 3、剪枝条件很明显,但是很多,不能出错 Problem : 1045 ( Fire Net )      Judge Status : Accepted RunId : 1346734     Language : C++     Author : 05xiaofendui Code Render Status : Rendered By HDOJ C++ Code Rander Version 0.01 Bet #include<iostream> using namespace std ; int n ; //实际上棋盘的规模 int FinalCount = 0 ; int map [ 4 ][ 4 ]={ 0 }; /*0 自由状态,1 已经住人 ,-1 是墙*/ int panduan ( int row , int col ) { int left_i , right_i , up_i , down_i ; //先向左看 int temp_row = row ; int temp_col = col ; for ( left_i = 1 ; left_i < n && temp_col > 0 ; left_i ++) { temp_col --; if ( map [ temp_row ][ temp_col ]==- 1 ) break ; //这边就不用再看了 else if ( map [ temp_row ][ temp_col ]== 1 ) return 0 ; //这个方向有人了,不要再探索了 } temp_col = col ; for ( right_i = 1 ; right_i < n && temp_col < n - 1 ; right_i ++) { temp_col += 1 ; if ( map [ temp_row ][ temp_

基础数学的应用--POJ1423

方法1:       POJ1423题目的意思是给出一个N,问N!的数字有多少位。对于这种题目,我们首先想到的是使用高精度乘法的方法模拟,最后在看看有多少位,但是这道题目的数据庞大,达10^7,高精度模拟显然不行。因此我们必须另外想方法。        要知道一个数字的位数是多少,我们可以用log10函数求得。例如,对于一个数,N=10,10!=3628800,而log10(3628800)=6.559763033,那么只要将这个数向上取整,就是7,就是10!的位数。当然,直接算log10(10!)是不可能的,但是根据对数的加法的性质,我们有 log10(10!) = log10(1*2*3.....*9*10)=log10(1) + log10(2) + log10(3) + ... + log10(9) +log10(10),这样的话,即使是10^7,我们也可以对其直接进行log10的函数计算。至于向上取整,我们有另外一个函数,其原形double ceil(double)。有这个函数我们可以很方便的对一个浮点数向上取整。      问题又来了,这道题目给出的限时是1000ms。假如对于给出的每一个数据,我们都慢慢地将它从log10(1) 慢慢加到log10(N),绝对会超时。因为里面有大量重复的运算,例如log10(1),如果有100组数据,那么它的值就会被计算100次。于是,我们想到,能否把所有计算过的log10值保存起来,然后若遇到重复的,就从这个结果数组里面提取就可以了,不用再计算。这个方法很好,但是题目给出的数据规模比较大,开一个10^7大的double数组,绝对会Memory Excceed Limit。那么,既然如此,我们应该用什么方法来计算呢?       假设问题给出的C组数据,是从小往大排列的,例如,给出三个数据,10,20,30,那么我们可以想到,计算log10(20!)的时候,我们是可以利用long10(10!)的结果。因为: log10(10!) = log10(1) + log10(2) + log10(3) + ... + log10(9) +log10(10) log10(20!) = log10(1) + log10(2) + log10(3) + ... + log10(9) +log10(10) + log10(11

堆和栈的异同

首先,这里的堆栈与数据结构里面的不一样 栈:stack 堆:heap 栈分配地址是从高地址往低地址连续分配(好像VC默认给栈区是1M),不过我在VC里面测试了一下只有1036096个字节即1011.813KB--不到1M 堆分配内存是由操作系统从空闲链表中寻找没有使用过的分配。 一个很简单的比方: 使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。 使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。