摘要: 输入E R Nv1 v2 ... vn有n个工作,没做一个消耗一定的能量,但可以得到R个能量(最多为E,多则去除),初始能量是E, 每件工作的收益是v[i]*u[i], u[i] 做i使用的能量. u[i]>=0, u[i]<=E解:如果规定u[i]>=1,那么这个问题就很简单, find the max in V[ ], then use E energy to do it, the others use R to do them.So max gain is Vmax*E+ sum(Vnon-max *R).But u[i] can be zero.that is for 阅读全文
posted @ 2013-05-01 22:55 xxx's blog 阅读(238) 评论(0) 推荐(0) 编辑
摘要: 一个数字S={a1,a2,...,an}。假设划分两个子数组X, Y 是S 的,并且XUY=S。假设X元素之和为x, y元素之和为y, S元素之和为s。则x+y=s,目标min: y-x(假设y>=x)y-x=s-x-x=s-2*x欲使其min, 只需令2*x最大,即在满足2x<=s,也就是x<=s/2的情况下,求最大的x。这是一个背包问题。struct T{int v;int p;}void func(int a[], int n){s=sumof(a,n);int i,j;T c[n+1][s/2+2];for(i=1;i<=n;i++) for(j=1;2*j&l 阅读全文
posted @ 2013-01-26 19:16 xxx's blog 阅读(223) 评论(0) 推荐(0) 编辑
摘要: 在Pentium以上的CPU中,提供了一条机器指令RDTSC(ReadTimeStampCounter)来读取这个时间戳的数字,并将其保存在EDX:EAX寄存器对中。由于EDX:EAX寄存器对恰好是Win32平台下C++语言保存函数返回值的寄存器,所以我们可以把这条指令看成是一个普通的函数调用。像这样:inlineunsigned__int64GetCycleCount(){__asmRDTSC}但是不行,因为RDTSC不被C++的内嵌汇编器直接支持,所以我们要用_emit伪指令直接嵌入该指令的机器码形式0X0F、0X31,如下:inlineunsigned__int64GetCycleC.. 阅读全文
posted @ 2012-12-10 21:42 xxx's blog 阅读(343) 评论(0) 推荐(0) 编辑
摘要: KMP算法的思想是主串S 和模式串W,判断W是否匹配S如果主串S在i位置与W串在j位置出现不匹配的情况的时候,利用已经得到的匹配把W串尽量右移动一段距离。用伪代码写,如下:int kmp(string S, string W){while(i<S.length){if(S[i]==W[j]) {if(j==W.length-1) return i-j;i++; j++;} else {if(next[j]>-1){j=next[j];} else {i=i-j+1;j=0;}}这里我们一般记next[0]=-1;next[1]=0当j>=2时,找到最大的k,使得W[0]~W[ 阅读全文
posted @ 2012-10-30 23:42 xxx's blog 阅读(141) 评论(0) 推荐(0) 编辑
摘要: int judge(int a){return ((a&(a-1))==0);}比如100000&(011111)==0. 阅读全文
posted @ 2012-10-24 10:01 xxx's blog 阅读(153) 评论(0) 推荐(0) 编辑
摘要: [摘要]最近对程序占用内存方面做了一些优化,取得了不错的效果,总结了一些经验。简要说一下,相信会对大家写出优质的程序有所帮助。[关键字]Java内存研究 最近对程序占用内存方面做了一些优化,取得了不错的效果,总结了一些经验。简要说一下,相信会对大家写出优质的程序有所帮助。 经常你写了一个程序,一测试,功能没问题,一看内存占用也不多,就不去考虑其它的东西了。但可能程序使用了一个什么数据结构,会当数据规模变大时,内存占用激增。 基本&&关键的问题是,Java里各种东东占多少内存????????? 对于primitive类型,有8个 byte short int long float 阅读全文
posted @ 2012-09-18 08:52 xxx's blog 阅读(151) 评论(0) 推荐(0) 编辑
摘要: 轮盘法, 用于遗传算法中的selection方法。轮盘赌算法/** 按设定的概率,随机选中一个个体* P[i]表示第i个个体被选中的概率*/int RWS(){ m = 0; r =Random(0,1); //r为0至1的随机数 for(i=1;i<=N; i++) { /* 产生的随机数在m~m+P[i]间则认为选中了i * 因此i被选中的概率是P[i] */ m = m + P[i]; if(r<=m) return i; }}有N个序列,... 阅读全文
posted @ 2012-09-12 21:24 xxx's blog 阅读(801) 评论(0) 推荐(0) 编辑
摘要: 如何计算a^b mod c? 当a, b可能会比较大的时候。我们都知道公式(a*b)%c=(a%c)*(b%c)%c。推导出蒙哥玛利模幂算法:待续 b%=m; int result=1; while(e>0) { if( e&1 == 1 ) result = (result*b)%m; // multiply in this bit's contribution while using modulus to keep result small // move to the next... 阅读全文
posted @ 2012-09-10 22:13 xxx's blog 阅读(232) 评论(0) 推荐(0) 编辑
摘要: C(n,m)如何计算?我们都知道公式:C(n,m)=C(n,m-1)+C(n-1,m-1)。这当然可以用递归实现,但我们发现用二维数组更好,因为这分明就是一个动态方程嘛。public int calcChoose(int n, int m){ int c[][]=new int[n+1][n+1]; for(int i=1;i<=n;i++){ c[i][0]=1; for(int j=1;j<=i;j++){ c[j][j]=1; c[i][j]=c[i-1][... 阅读全文
posted @ 2012-09-08 16:42 xxx's blog 阅读(186) 评论(0) 推荐(0) 编辑
摘要: 设L=<a1,a2,…,an>是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=<aK1,ak2,…,akm>,其中k1<k2<…<km且aK1<ak2<…<akm。求最大的m值。最长递增子序列,Longest Increasing Subsequence 下面我们简记为 LIS。不要求这个子序中的数字是连续的。比如说有子序列{1, 9, 3, 8, 11, 4, 5, 6, 4, 19, 7, 1, 7 }这样一个字符串的的最长递增子序列就是{1,3,4,5,6,7}或者{1,3,4,5,6,19}。解法一:将S排序得到 阅读全文
posted @ 2012-08-24 11:03 xxx's blog 阅读(181) 评论(0) 推荐(0) 编辑