几个博弈
来源:互联网 发布:centos chrome 安装包 编辑:程序博客网 时间:2024/05/16 01:38
POJ 1067-取石子游戏
题意:有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者。
威佐夫博奕(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。
while ( scanf( "%d%d", &a, &b ) ) if ( a > b ) { t = a; a = b; b = t; } d = b - a; t = floor( d * ( sqrt(5.0) + 1 ) / 2 ); puts( (t == a) ? "0" : "1" );
POJ 1740-A New Stone Game
题意:对于n堆石子,每堆若干个,两人轮流操作,每次操作分两步,第一步从某堆中去掉至少一个,第二步(可省略)把该堆剩余石子的一部分分给其它的某些堆。最后谁无子可取即输。
while (scanf("%d", &n), n) { memset(count, 0, sizeof(count)); for (i = 0; i < n; ++i) { scanf("%d", &m); ++count[m]; } for (i = 1; i <= maxn; ++i) { if (count[i] & 1) break; } printf("%d\n", i != maxn+1); }
POJ 1704-Georgia and Bob
题意:n个位置有东西,然后现在每次要把这些东西向左移动,只能移动到最左边或者被其他东西挡住的位置,谁先无法移动就输,问最后谁赢
思路:转化为Nim游戏,首先相邻的两个作为1组,如果是奇数,就第一个和0作为1组,然后如果移动每组的前一个棋子,其实是没有影响的,因为后手可以跟他一样,把后面的棋子移动一样的步数,而移动后手,相当于把一个区间缩短,这样一个区间的长度就等同于Nim游戏中石子的数量,转化为了Nim游戏
POJ 1082-Calendar Game
POJ 2311-Cutting Game
题目:两个人轮流剪纸片,直到有一个人剪出1*1的方格就算这个人赢了。然后给出纸片的长和宽,求先手会赢还是会输
int get_sg(int n,int m){ if(sg[n][m]!=-1) return sg[n][m]; int vis[maxn]; memset(vis,0,sizeof(vis)); for(int i=2;i<=n-i;i++) vis[get_sg(i,m)^get_sg(n-i,m)]=1; for(int i=2;i<=m-i;i++) vis[get_sg(n,i)^get_sg(n,m-i)]=1; for(int i=0;;i++) if(vis[i]==0) return sg[n][m]=i;}
POJ 2312 Battle City
HDU 1079 Calendar Game
HDU 1525 Euclid’s Game
题意:题目给出了两个正数a.b,每次操作,大的数减掉小的数的整数倍。一个数变为0 的时候结束。谁先先把其中一个数减为0的获胜。问谁可以赢。
while(n>0&&m>0) { if(n<m) swap(n,m); if(n%m==0) break; if(n-m>m) break; n=n-m; flag=!flag; } if(flag) { printf("Stan wins\n"); } else { printf("Ollie wins\n"); }
HDU 1564 Play a game
题意:给定一个n*n的表格,在一个角上放入一块石头,然后两个人轮流移动石头,只能水平和竖直移动石子,而且不能移到已经访问的格子,最后没法移动的玩家为输者。
while(t--) { int n,m; scanf("%d%d",&n,&m); if(n%(m+1)==0) printf("second\n"); else printf("first\n"); }
HDU 1847 Good Luck in CET-4 Everybody!
题意:总共n张牌,双方轮流抓牌,每人每次抓牌的个数只能是2的幂次,最后抓完牌的人为胜者。
HDU 2897 邂逅明下
题意:给出硬币的个数,每人轮流取,最少取p个,最多取q个,最后取的人就输了
思路:最主要是判断最后剩下的硬币的个数就是了,由于是问是否有必胜的策略,所以当轮到A是剩下的硬币0<=K<=p则A胜否则B胜利
N = (p+q)*r+k
A胜:假设第一次A取T个,则以后每次B取X个,A就取(p+q-x)个,剩下的只要q
a=0,b=0;for(int i=0;i<n;i++){ scanf("%I64d%I64d",&x,&y); while(x>1&&y>1) { x=x>>1; y=y>>1; } if(x==1) b+=y-1; else a+=x-1; }printf(a>b?"Alice\n":"Bob\n");
HDU 3863 No Gambling
第一个人从左到右连接蓝点,第二个人从上到下连接红点,轮流进行,看最后谁的线最多则赢,只要是先手,那么连的线一定是最多了。
HDU 2176 取(m堆)石子游戏
HDU 2177 取(2堆)石子游戏
- 几个博弈
- 几个经典的博弈
- 几个经典的博弈
- 几个经典的博弈
- 几个简单的博弈例子
- 几个取石头的博弈~~简单归纳,大神不要笑~~
- 几个取石头的博弈~~简单归纳,大神不要笑~~
- 博弈
- 博弈
- 博弈
- 博弈
- 博弈
- 博弈
- 博弈
- 博弈
- 博弈
- 博弈
- 博弈
- 使用Ratpack与Spring Boot构建高性能JVM微服务
- Android Studio 默认keystore 以及自定义keystore
- 《阿甘正传》
- 123. Best Time to Buy and Sell Stock III
- 深入研究PHP及Zend Engine的线程安全模型
- 几个博弈
- 论文搜集
- JSTL标签中c:choose,c:when,c:otherwise 可以实现if...else if..else的用法
- HDU 1575 Tr A (矩阵乘法)
- 关联式容器-map
- 数据结构---排序算法总结
- 动态规划之子集和问题
- 欢迎使用CSDN-markdown编辑器
- 打印结果