![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
博弈
lihaogegehuting
这个作者很懒,什么都没留下…
展开
-
hdu 1850 Being a Good Boy in Spring Festival
我们知道在Nim博弈中 如果我们面对的是一个非奇异局势(a,b,c),要如何变为奇异局势呢?假设 a b)=(a(+)a)(+)(b(+)b)=0(+)0=0。要将c 变为a(+)b,只要从 c中减去 c-( a(+)b)即可。 也就是说,其中一个堆C必须大于所有其他所有堆异或的值,由此我们可以进行枚举 即(sum^a[i])#include int main()原创 2014-07-27 23:24:32 · 786 阅读 · 0 评论 -
poj 1067 取石子游戏
威佐夫博奕。。。。。 代码如下: #include #include int main() { int a,b,k,temp,n; double m; while(~scanf("%d%d",&a,&b)) { if(a>b) { temp=a; a=b; b=temp;原创 2014-08-12 15:37:18 · 688 阅读 · 0 评论 -
hdu 1847 Good Luck in CET-4 Everybody!
法一: 首先我们可以想到在面对3的时候是必败局,谁面对3时无论拿多少都会败 ! 那么就要尽量造成这样的局势给对方,因为任何不是3的倍数的数加1或2都可以变成3的倍数, 同理减去1或2也可以变成3的倍数,也就是说假设目前的个数不是3的倍数,那我肯定能把它 拿成3的倍数,比如现在是11个,那我拿走2个就变成9,这样就造成对方为3的倍数局势,那 么对方拿m个我都可以通过拿原创 2014-08-12 21:49:50 · 862 阅读 · 0 评论 -
hdu 2177 取(2堆)石子游戏
天资愚笨啊,网上的一大堆没看懂。。。。。。 总结百科的方法为: 1.a==b 同时减去a 得到0,0 2.a==a_k b>b_k b -(b-b_k) 3.a==a_k b 同时拿走a_k-a_(b-a_k) 得到 a_(b-a_k) a_(b-a_k) + b-a_k 4.a>a_k b==b_k原创 2014-08-11 23:46:19 · 982 阅读 · 0 评论 -
hdu 1527 取石子游戏
先解释一下威佐夫博弈吧: 所谓威佐夫博弈,是ACM题中常见的组合游戏中的一种,大致上是这样的: 有两堆石子,不妨先认为一堆有 10,另一堆有 15 个,双方轮流取走一些石子,合法的取法有如下两种: 1、在一堆石子中取走任意多颗; 2、在两堆石子中取走相同多的任意颗; 约定取走最后一颗石子的人为赢家,求必胜策略。 两堆石头地位是一样的,我们用余下的石子原创 2014-08-11 21:49:20 · 888 阅读 · 0 评论 -
hdu 2509 Be the Winner
详解:hdu 1907 John - lihaogegehuting的专栏 - 博客频道 - CSDN.NET 两道题几乎一样 代码如下: #include int main() { int T,a[100],i,sum,ok; while(~scanf("%d",&T)) { sum=0; ok=0;原创 2014-07-28 15:56:48 · 971 阅读 · 0 评论 -
hdu 1907 John
取火柴的游戏 题目1:今有若干堆火柴,两人依次从中拿取,规定每次只能从一堆中取若干根, 可将一堆全取走,但不可不取,最后取完者为胜,求必胜的方法。 若sum=0;则先取者输,后取者胜; 若sum=!0,则先取者使其变成奇异状态,先取者胜 即谁先面临奇异状态谁输; 题目2:今有若干堆火柴,两人依次从中拿取,规定每次只能从一堆中取若干根, 可将一堆全取走,但不可不取,原创 2014-07-28 00:38:45 · 1209 阅读 · 0 评论 -
hdu 2516 取石子游戏
引用:http://blog.csdn.net/dgq8211/article/details/7602807 有一堆个数为n的石子,游戏双方轮流取石子,满足: 1)先手不能在第一次把所有的石子取完; 2)之后每次可以取的石子数介于1到对手刚取的石子数的2倍之间(包含1和对手刚取的石子数的2倍)。 约定取走最后一个石子的人为赢家,求必败态。 这个和之前的Wythoff原创 2014-07-27 15:25:47 · 850 阅读 · 0 评论 -
hdu 悼念512汶川大地震遇难同胞——选拔志愿者
简单的巴什博弈 代码如下: #include int main() { int n,m,c ; scanf("%d",&c); while(c--) { scanf("%d%d",&n,&m); if(n<m) printf("Grass\n"); else if(n%(m+1)==0) printf("Rabbit原创 2014-07-27 13:43:54 · 943 阅读 · 0 评论 -
poj 3480 John
详解见::hdu 1907 John - lihaogegehuting的专栏 - 博客频道 - CSDN.NET 两道题一样。。。 代码如下:#include int main() { int T,a[100],i,sum,m,ok; while(~scanf("%d",&T)) { while(T--) { sum=0;原创 2014-07-28 16:03:50 · 912 阅读 · 0 评论 -
hdu 1849 Rabbit and Grass
Nim博弈 题意:有m堆牌,两个人先后取某堆中的任意(不少于一)张牌,最后取完者胜;问先手取胜第一次取牌有多少种取法。 思路:1)如若给出 的是必败状态:a1^a2^......^an=0,则先手不会有任何可能获得胜利; 2)若给出的是必胜状态:a1^a2^.......^an=k,(其中k不为零),那么我们的目的是要把必胜状态 转化为原创 2014-07-27 22:47:37 · 758 阅读 · 0 评论 -
hdu 2987 邂逅明下
巴什博弈的变形:假设先取者为A,后取者为B,初始状态下有石子n个,除最后一次外其他每次取得石子个数必须在[p,q]之间。 若当前石子共有n =(p+q)* r个,则A必胜,必胜策略为:A第一次取q个,以后每次若B取K个,A取(p+q-k)个,如此下去最后必剩下p个给B,所以A必胜。 若n =(p+q)* r + left个(1 left p)B必胜,必胜策略为:每次取石子活动中,若A原创 2014-07-27 16:38:44 · 1008 阅读 · 0 评论 -
hdu 1846 Brave Game
(一)巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规 定每次至少取一个,最多取m个。最后取光者得胜。 显然,如果n=m+1,那么由于一 次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品, 后者取胜。因此我们发现了如何取胜的法则:如果n=(m+1)r+s,(r为任意自然数, s≤m),那么先取者要拿走s个物品,如果后取者拿走原创 2014-07-27 13:24:49 · 825 阅读 · 0 评论 -
hdu 1536 S-Nim|| poj 2960 S-Nim (sg函数)
#include #include int s[110]; int sg[10010],hash[110]; int n, m; int getsg(int x) //sg模板 { int i; if(sg[x] != -1) return sg[x]; memset(hash,0,sizeof(hash)); for(i = 0; i < n; i++) {原创 2014-08-13 18:07:30 · 1089 阅读 · 0 评论