算法
born1985man
这个作者很懒,什么都没留下…
展开
-
约瑟夫环问题
设约瑟夫环有n个人,每个m个数出列,从第k个人开始报数n个人问题可以转化为n-1个人的问题 然后倒推来计算就可以了1 2 3 4 ...k-1 k+1...n中k出列,把剩下的映射到1到n-1的自然数上面 k+1 ->1k+2 ->2...k-2->n-2k-2->n-1 这就变成1到n-1的约瑟夫问题以此递推,有下面的倒推公式来计算最终胜利者在开始转载 2009-09-29 19:17:00 · 140 阅读 · 0 评论 -
位运算
===== 真正强的东西来了! =====二进制中的1有奇数个还是偶数个 我们可以用下面的代码来计算一个32位整数的二进制中1的个数的奇偶性,当输入数据的二进制表示里有偶数个数字1时程序输出0,有奇数个则输出1。例如,1314520的二进制101000000111011011000中有9个1,则x=1314520时程序输出1。var i,x,c:l转载 2009-10-21 15:53:00 · 135 阅读 · 0 评论 -
思想永远比知识重要:调和级数,欧拉常数
今天看到一道有趣的题目,用的思想跟之前讲过的N架飞机问题很类似,都是调和级数的应用调和级数 1+1/2+1/3+1/4+...+1/n= ln(n+1)+r欧拉常数 r是常量约等于0.577218蚂蚁橡皮筋问题:一只蚂蚁,以1的速度从橡皮筋的一端向另一端爬,同时橡皮筋以10的速度拉长,请问蚂蚁最终能爬到终点么?解法1:我们可以列出蚂蚁原创 2009-10-15 17:01:00 · 1524 阅读 · 0 评论 -
用位运算求最大值最小值
#include using namespace std;#define AB(a,b) (((a-b)>>31)&0x1)void minmax(int a,int b){ int max,min; max=(abs(a-b)+a+b)/2; min=((a+b)-abs(a-b))/2; cout} /*Use the原创 2009-10-15 16:08:00 · 825 阅读 · 0 评论 -
等概率随机数问题
问题:1-6之间的等随即数生成器,如何生成1-N之间的等随即数生成器O(logN)复杂度,扩展一点就是如何用n进制数去逼近N 例如用 随即生成器A(1,2,3,4,5,6)生成区间1-N之间的随即生成器B,我们可以算算需要调用多少次A来生成B 假设需要m位6进制来表示N,那么m=floor(lgN/lg6+1) 同时用m位6进制产生的冗余度 d=pow(6,m)/N原创 2009-10-12 17:16:00 · 444 阅读 · 0 评论 -
1架飞机,加满油可以跑1的距离,问N架飞机最多能跑多远
问题:1架飞机,加满油可以跑1的距离,问N架飞机最多能跑多远,要确保除了最远的飞机外,其他飞机都能安全返航?昨天同学出了这个问题,晚上仔细想了想这个问题还挺有趣的。首先题目的意思允许我们在不同的飞机之间交换油,也就是一家飞机可以把一部分油分给其他飞机,然后自己再继续飞或者返航下面分两种情况来考虑1.假设每架飞机只能加一次油,答案是:N趋向无穷大时为2(1)首先我们证明不可能原创 2009-10-10 22:06:00 · 2560 阅读 · 2 评论 -
将N分成m个数的和,使得m个数乘积最大
问题1:如果m个数字可以重复分三种情况n%3==0 将m分成n/3个3 乘积最大n%3==1 将m分成n/3-1个3 还有一个4n%3==1 将m分成n/3个3 还有一个2证明比较简单 问题2:如果m个数字不可以重复 可以证明其必然是一个连续递增的序列或者是连续递增的两个数列,且间隔为1从而可以直接推导出公式具体做法如下首先原创 2009-10-02 21:31:00 · 514 阅读 · 0 评论 -
1-N的自然数中,少了一个,找出这个数
问题1:1-N的自然数中,少了一个,找出这个数O(n)空间的比较简单,下面给出几个个只需要1,2个额外变量的算法(1)求和-容易溢出S1=1+2+...+N=(N+1)N/2然后遍历数列每次从S1中减去当前的数字最后剩下的数字就是所求为了防止溢出我们可以每次在S1大于一定的数字后,就去减,然后继续求和,再大于就继续减,以此类推。(2)异或Y1=1^2^3...^原创 2009-10-02 19:00:00 · 1371 阅读 · 1 评论 -
排列与变进制数
生成排列的方法之一是用变进制数假设要生成1,2,3,4的全排列,可按照以下步骤做(0)i=0(1)将i转化为变进制数,例如对19,转化为变进制数301变进制数的规则是个位逢2进一,百位逢3进一,千位逢4进一每个变进制数与排列的逆序数一一对应而上面生成的就是排列的一个逆序数(2)根据1中的逆序数构造排列如果301 对应的排列就是4213(3)i++ &&i原创 2009-10-02 11:32:00 · 275 阅读 · 0 评论 -
猴子分桃问题
问题1:n个猴子分m个桃子,第一只猴子将m个桃子均匀分成n堆,然后拿走自己的一份,将剩下的并到一起...第i个猴子将m个桃子均匀分成n堆,拿走自己的一份,将剩下的并在一起问M的最小值是多少?/***************/假设第i个猴子拿走自己的一份后剩下Pi个桃子那么有以下的关系式P1=m*(n-1)/nP2=P1*(n-1)/nP3=P2*(n-1)/n原创 2009-10-02 15:32:00 · 348 阅读 · 0 评论 -
几种数据结构
这几种结构都是用数组或者链表来模拟树结构从而能达到logN的操作复杂性1 树状数组适用:没有删除和增加的操作,每次有若干个元素增大或者减小,要求某个区间的和时间:log(N)空间:O(N) 2 散列表适用:没有删除和添加以及更改,查询某个区间最大最小值时间:O(NlogN)预处理 O(1)查询空间:O(NlogN) 3 线段树适用:比1,2更通原创 2009-10-04 11:02:00 · 261 阅读 · 0 评论 -
树状数组
第一次看到树状数组的时候,首先想到的就是跳跃表和散列表以及块状链表,都是利用链表或者数组来模拟树的性质,从而得到logN级别的操作对于一个数组A,我们定一个数组B使得B[i]=A[i-2^k+1]...A[i] k=lowbit(i)意思就是对于下标i 我们令k是i二进制表示中从低位到高位数第一个为1的位然后B[i]存储的就是向前数2^k个A[i]例如对于A[1].原创 2009-10-04 10:34:00 · 345 阅读 · 0 评论 -
摔蛋问题
问题1:100层楼有一个鸡蛋,如果确定刚好摔碎的那个楼层,最坏情况下最少需要摔多少次?从1到100层依次摔,最坏要100次问题2:如果有两个鸡蛋?用分层的方法我们要将100层楼分成多个区段然后用第一个鸡蛋去确定区段用第二个鸡蛋去确定区段中的位置具体的做法是用按照14 13 12...1的楼层来摔可以证明其是最优的问题3:如果是3个鸡蛋?继续用原创 2009-10-03 21:14:00 · 711 阅读 · 0 评论 -
BT的条件概率
问题1:一家有两个孩子,其中一个是女孩,问另外一个是女孩的概率,男孩的概率? 第一反应都是1/2,错!看上去两个似乎是独立的事件,但实际上不是!要考虑条件概率! 首先样本空间为 BG BB GG GB可以看出 在不知道其中一个性别的情况下 另一个是女孩的概率为(GB+GG)/(BG+BB+GG+GB) 或者(BG+GG)/(BG+BB+GG+GB)=1/2原创 2009-09-30 01:21:00 · 296 阅读 · 0 评论