摘要: #存储 ###行存 ####CSN Commit Sequence Number,(行存)待提交事务的序列号,它是一个64位递增无符号数 ###列存 ####CU compression unit,列存储单元 阅读全文
posted @ 2022-04-21 15:13 zhen94 阅读(78) 评论(0) 推荐(0) 编辑
摘要: 题意:有n种硬币,给出每种硬币的面值和个数,问这些硬币能组成多少种小于m的面值。 状态化的多重背包,二进制拆01背包超时,教主本意是要用单调队列来做,不过由于时间限制比较宽松所以可以转完全背包来做。 想法就是新建一个数组来存每种状态中用了多少个第 i 种硬币,在用第 i 种硬币更新状态时,同时更新这个记录数组。 代码如下: #include#includeint bag[100005],use... 阅读全文
posted @ 2014-03-04 17:10 zhen94 阅读(137) 评论(0) 推荐(0) 编辑
摘要: 问题描述:二维背包,求达到经验值时耐心的最小消耗,当包内worth达到规定值时跳出返回答案。关于三层循环的顺序:(i:物品种类,c1:cost1,c2,cost2)1、for i = 1 to k for c1 = 1 to c1_max for c2 = 1 to c2_max用每种物品进行更新状态,只有在循环结束时才能得到最优解;每次外层循环++时,某状态下第i种物品使用数便可以确定了,故便于记录第i种物品在某状态中用了多少个。2、for c1 =1 to c1_max for c2 = 1 to c2_max for i = 1 to k这样是对每... 阅读全文
posted @ 2014-03-04 15:43 zhen94 阅读(170) 评论(0) 推荐(0) 编辑
摘要: 注意初始位置的初始化,如果标为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) 编辑