02 2014 档案

摘要:注意初始位置的初始化,如果标为0的话,循环从初始位置开始时move会多1. #include#includeint main(){ int a,b,n; while(scanf("%d%d%d",&a,&b,&n),a||b||n) { int map[15][15],step[15][15]; memset(map,0,sizeof(map)); ... 阅读全文
posted @ 2014-02-25 19:35 zhen94 阅读(112) 评论(0) 推荐(0) 编辑
摘要:朴素的筛法在时间上的额外开销主要是因为同一个数会被筛掉好几次,所以线性筛法要做的就是利用数学方法保证每个和数只被筛掉一次。 原理: 每一个和数都可以分解成一个质数乘一个整数的形式,朴素筛法正是通过这样的策略去筛,但是这个条件很粗略,导致和数分解的方式不唯一。 在线性筛法中,和数(n)被分解成“n的最小质因数(p)* n的最大因数(a)”,(a可以=p);其中p为最小质因数时,a必然为最大因数,反... 阅读全文
posted @ 2014-02-22 00:36 zhen94 阅读(424) 评论(0) 推荐(0) 编辑
摘要:问题描述:在HDU 2064的基础上增加一条规则:最大的盘子可以放在其他盘子上,不可以从左移动到右或从右移动到左因为最大的盘子的移动规则和其他盘子不一样,所以要单独处理它:1)前n-1个盘子A->B2)第n个盘子A->B->C3)前n-1个盘子B->Cans[n]=F[n-1]*2+2; //F[n]为n个盘子移动到相邻柱的操作数接下来规则就对所有盘子适用了,可以递推求解,首先要求上一步中出现的F[n],即相邻柱移动的操作数1)前n-1个盘子A->C;2)第n个盘子A->B;3)前n-1个盘子C->B;F[n]=f[n-1]+1+F[n-1]; //f 阅读全文
posted @ 2014-02-20 13:12 zhen94 阅读(192) 评论(0) 推荐(0) 编辑
摘要:问题描述:在汉诺塔的规则上附加一条不能从左直接移到右或者从右移动到左,求操作数。由于不能直接用A柱到C柱,所以第n个盘子只能A->B->C,所以前n-1个盘子要移到C让路(nth A->B),再移到A让路(nth B->C),最后前n-1个盘子移到C完成操作。移动策略:1)前n-1个盘子A->C2)第n个盘子A->B3)前n-1个盘子C->A4)第n个盘子B->C5)前n-1个盘子A->C得出递推公式:f[n]=f[n-1]*3+2;#includeint main(){ long long f[36]; int i,n; for(i=2, 阅读全文
posted @ 2014-02-20 12:19 zhen94 阅读(263) 评论(0) 推荐(0) 编辑
摘要:问题描述:求n阶汉诺塔第x步移动策略开始的时候以为是汉诺塔的递归模拟,然后果断超时了。由于汉诺塔步骤1和步骤3的操作数相同,所以这里用二分查找来加速。n阶汉诺塔需要移动2^n-1次,所以mid=(2^n-1+1)/2=2^n-1,当step>mid时,step-=mid,转化成n-1阶汉诺塔。#includelong long step,f[64];void bsHanoi(int n,int a,int b,int c){ long long mid=f[n-1]; if(step==mid) { printf("%d %d %d\n",n,a,c); ... 阅读全文
posted @ 2014-02-18 22:21 zhen94 阅读(285) 评论(0) 推荐(0) 编辑
摘要:题意:问n个盘子的合法排列方式有几种。这题虽然叫汉诺塔但是感觉和汉诺塔没什么关系,水题一枚盘子从大到小依次选择位置,以保证合法性;每个盘子有三个可选位置,f[n]=f[n-1]*3;#includeint main(){ long long f[30]; int i,n,t; for(i=2,f[1]=3;i<30;i++) f[i]=f[i-1]*3; scanf("%d",&t); for(i=0;i<t;i++) { scanf("%d",&n); printf("%I64d\n",f[n]); } 阅读全文
posted @ 2014-02-16 22:02 zhen94 阅读(122) 评论(0) 推荐(0) 编辑
摘要:问题描述:求n阶汉诺塔,上数第k个盘子的移动次数 首先:由于比k小的盘子移动不会牵扯k移动,所以问题被简化成n-k+1阶汉诺塔中第一个盘子的移动次数。 再观察汉诺塔的移动策略: 1)将A上n-1个盘子借助C座线移到B座上; 2)把A座上剩下的一个盘移到C座上; 3)将n-1个盘从B座借助于A座移到C座上。 步骤2)中该盘子未移动,所以递推公式f[n]=2*f[n-1], 由于问题已经转化成n-... 阅读全文
posted @ 2014-02-16 21:41 zhen94 阅读(294) 评论(0) 推荐(0) 编辑
摘要:思路是看来的,粘一下: 问题描述:在经典汉诺塔的基础上加一个条件,即,如果再加一根柱子(即现在有四根柱子a,b,c,d),计算将n个盘从第一根柱子(a)全部移到最后一根柱子(d)上所需的最少步数,当然,也不能够出现大的盘子放在小的盘子上面。注:1#define INF 0x7fffffffint main(){ unsigned long long F[65],f[65],min;//这里... 阅读全文
posted @ 2014-02-16 01:24 zhen94 阅读(217) 评论(0) 推荐(0) 编辑
摘要:直接看大犇的帖子没看懂,看别人解读过一次的才明白,题意是找出有多少个联动独立的区间,每有一个独立区间便n—,最后结果为26^(n-区间数)。存在的问题是不能直接用区间的左右数字来查找,因为这样[1,2],[2,3],[3,5]会被记作两个区间,而事实上是三个,因此要以[L-1,R]或[L,R+1]为条件进行查找;其次因为n很大所以要用到快速幂。 代码如下: #include#define CONS... 阅读全文
posted @ 2014-02-09 23:10 zhen94 阅读(460) 评论(0) 推荐(0) 编辑