随笔分类 -  算法

摘要:题目连接:http://poj.org/problem?id=1077题目描述:给出一个迷宫,#表示墙,S表示起点,E表示终点。求从S到E的优先靠左边的墙走、优先靠右边的墙走和S到E的最短路径。解法:求优先靠左靠右的路径,用dfs,求最短路径用bfs即可。dfs中可以用nx = x+move[(i+4)%4][0];ny = y+move[(i+4)%4][1];处理很巧妙View Code 1 #include 2 #include 3 #include 4 #include 5 #include 6 #define see(x) cout q; 19 int bfs(){ 2... 阅读全文
posted @ 2012-04-06 23:03 celia01 阅读(285) 评论(0) 推荐(0)
摘要:除了准备离散考试外,算是第一次仔细学习图论和网络流的相关知识了。以前只知道用最大二分匹配的模板,今天就把理论知识好好总结一下,以免以后忘记。从网上搜罗了一些知识,有一下几篇文章讲的很不错:http://imlazy.ycool.com/post.1603708.htmlhttp://old.blog.edu.cn/user3/Hailer/archives/2007/1829623.shtmlhttp://www.cnblogs.com/syxchina/archive/2011/07/10/2197204.htmlhttp://zh.wikipedia.org/wiki/%E5%8C%B.. 阅读全文
posted @ 2012-04-02 20:18 celia01 阅读(1221) 评论(0) 推荐(0)
摘要:取石子游戏的变体。题意:有m堆石子,事先给定一个集合S,每次只能从一堆中取石子,且取的石子个数必须是S中的数。没有石子可取或者不能按规则取石子即为输。给定初始情况,判断最开始的局面是必败L,还是必胜W局面。这题如果知道SG函数,就很好解了。由sg的基础知识可知,某一局面的sg值为0则对应P局面,反之对应N局面,所以把最终局面的sg值求出来就可以了。这里在用到一个定理: 设gi为子游戏Gi的SG函数,那么组合游戏G的SG函数为:g(x1,x2,x3,...xn) = g1(x1) xorg2(x2) xor... xorgn(xn)先考虑只有一堆的情况,在把各堆的sg值异或就可以了。这是一个求. 阅读全文
posted @ 2012-02-01 18:41 celia01 阅读(425) 评论(0) 推荐(0)
摘要:DescriptionThe Farey Sequence Fn for any integer n with n >= 2 is the set of irreducible rational numbers a/b with 0 #include#include#include#include#define see(x) coutk)和p[j]共同筛出来了。对筛素数的代码,略加几行代码,就可以顺带求出欧拉函数phi[x]了。用到了递推式:对于p|x。若p2|x,则phi(x) = phi(x/p)*p;否则phi(x) = phi(x/p)*(p-1) 阅读全文
posted @ 2012-02-01 17:38 celia01 阅读(260) 评论(0) 推荐(0)
摘要:版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://maoyu2010.blogbus.com/logs/103213871.html花了一天的时间学了点博弈,算是懂了一点点基础的知识吧,下面分享一点我的经验,仅供不懂博弈的菜鸟尽快入门,大牛请无视。首先来玩个游戏,引用杭电课件上的:(1)玩家: 2 人; (2)道具: 23 张扑克牌; (3)规则: 游戏双方轮流取牌; 每人每次仅限于取1 张、 2 张或 3 张牌; 扑克牌取光,则游戏结束; 最后取牌的一方为胜者。想一下。。首先申明一点,博弈的讨论是在大家都玩的最好的情况下讨论的。(如果2 个玩家智商有差别,那就没法 阅读全文
posted @ 2012-01-27 21:27 celia01 阅读(465) 评论(0) 推荐(0)
摘要:struct point{ node a, b;}p[N];1、选择不相交区间 【例1】数轴上有n个开区间(ai,bi)。选择尽量多个区间,使得这些区间两两没有公共点。 【Solution】 bool cmp(point x, point y){ if(x.b!=y.b) return x.a<y.a; else return x.b<y.b; } sort(p,p+n,cmp); 再一次选区间2、区间选点问题 【例2】数轴上有n个闭区间[ai,bi]。取尽量少的点,使得每个区间内都至少有一个点(不同区间内含的点可以是同一个)。 【Solut... 阅读全文
posted @ 2012-01-26 15:33 celia01 阅读(560) 评论(0) 推荐(0)
摘要:上次做poj 1067的取石子游戏,只用到了whthoff博弈,未涉及到取石子的异或方法,今天重新搜索,整理了一遍。搜罗各种资料,加上自己整理,终于成篇啦!……噼里啪啦取石子问题有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍或是围棋子等等均可。两个人轮流从堆中取物体若干,规定最后取光物体者取胜。这是我国民间很古老的一个游戏,别看这游戏极其简单,却蕴含着深刻的数学原理。下面我们来分析一下要如何才能够取胜。(一)巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。显然,如果n=m+1,那么由于一次最多只能取m个,所以, 阅读全文
posted @ 2011-11-15 21:36 celia01 阅读(9324) 评论(2) 推荐(9)
摘要:题意:有a、b、c三个人同时工作,三个人做不同的任务需要不同的时间,但最后要求三个人做事情的总时间相同,输出做完所有任务需要的最少时间,如果无法达到三个人总工作时间相同,则输出“No”当时一股脑筋觉着是最大流或者其他图论的东西,然后也往dp上想过,就连状态表示都没想出来。后来借鉴了一下大牛们的做法,标准做法应该是bfs所有可能情况,然后再一一帅选。这个bfs好久没写过了,暂时就没写。还有一种特别巧妙的方法:#include#include#include#includeusing namespace std;#define maxn 250 //maxn设为250是保证250>=120* 阅读全文
posted @ 2011-11-15 21:28 celia01 阅读(323) 评论(0) 推荐(0)
摘要:又是一次初始化惹的货!!!超级水的贪心。。。害的我以为思路错误~~ ~#include#include#include#include#include#include#includeusing namespace std;struct Sub{ int dl, rs;}sub[1005];int flag[1005];bool cmp(Sub a, Sub b){ if(a.dl!=b.dl) return a.dlb.rs;}int main(){ int t, n, i, j, k, l, m, ans; scanf("%d",&t); while(t--){. 阅读全文
posted @ 2011-08-16 01:06 celia01 阅读(139) 评论(0) 推荐(0)