洛谷P1290 欧几里德的游戏 数学 博弈论 模拟
Posted third2333
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷P1290 欧几里德的游戏 数学 博弈论 模拟相关的知识,希望对你有一定的参考价值。
洛谷P1290 欧几里德的游戏
数学 博弈论 模拟
这道题我们因为当 x 大于 y 时 你也只能在合法范围 内取 1 个 y 两个 y
也就是说 能取的y大于等于2时,则你本质不同的取法共有两种,此时你必定获胜,
因为本质不同,而在最优策略下,则说明胜利者也不同,也就是说这时候你可以
决定自己的输赢 ,我们称这种必胜局为 v 局
2、但是如果 v 局后面还有v 局怎么办,这个不必担心,因为先拿到 v局的人,
有两种本质不同的取法,也就是说 他可以控制自己下次必定拿到 v 局,这样就 能确保胜利了
所以说谁先到 x>=2*y 或者 y==0 的局面谁就胜利了
1 #include <cstdio> 2 #include <cmath> 3 #include <cstdlib> 4 #include <cstring> 5 #include <string> 6 #include <iostream> 7 #include <iomanip> 8 using namespace std ; 9 10 int T,x,y,now,t ; 11 12 inline int work(int x,int y) 13 { 14 now = 1 ; 15 while( 1 ) 16 { 17 now^=1 ; 18 if( x >= 2*y ) return now ; 19 t = x ; x = y ; y = t % y ; 20 if(y==0) return now ; 21 } 22 } 23 24 int main() 25 { 26 scanf("%d",&T) ; 27 while(T--) 28 { 29 scanf("%d%d",&x,&y) ; 30 if(x < y) swap(x,y) ; 31 work(x,y) ; 32 if( now==0 ) 33 printf("Stan wins\n") ; 34 else 35 printf("Ollie wins\n") ; 36 37 } 38 return 0 ; 39 }
另外还有一种做法是用黄金比来做
黄金比例
如果两个数相等,或者两数之比大于斐 波拉契数列相邻两项之比的极限((sqrt(5)+1)/2),则先手胜,否则后手胜。
我是这样理解的 设 x 永远大于 y
那么 若x 与 y 的比值 等于 黄金比的倒数 换句换说 就是 y 与x 的比值等于黄金比时 则 x 与 y 的比值永远不会变
这时候我们的判断条件还是一样 但稍有不同 如果比值 到 2 则先手胜 若比值 为 0.5 则后手胜
这时候 我们把黄金比称为平衡状态 x增大则破坏了平衡 使 比值趋向于 2
于是 先手胜 同理如果y变大 则 比值趋向0.5 所以后手胜
所以我们直接比较 比值与黄金比的关系就行了
当然,我的理解有许多是感性的理解,并没有理性的证明,纯属自己瞎理解,
如果哪位大神有严格证明的话,欢迎来告诉我
代码
1 #include<set> 2 #include<map> 3 #include<list> 4 #include<queue> 5 #include<stack> 6 #include<string> 7 #include<math.h> 8 #include<time.h> 9 #include<vector> 10 #include<bitset> 11 #include<memory> 12 #include<utility> 13 #include<stdio.h> 14 #include<sstream> 15 #include<iostream> 16 #include<stdlib.h> 17 #include<string.h> 18 #include<algorithm> 19 #define LL unsigned long long 20 using namespace std; 21 int main() 22 { 23 int i,c,a,b,m,n,k; 24 cin>>c; 25 for (i=1;i<=c;i++) 26 { 27 scanf("%d %d",&m,&n); 28 if (m==n) printf("Stan wins\n"); 29 else 30 { 31 if (m<n) 32 { 33 if ((n*1.0)/m>(sqrt(5)+1)/2) 34 printf("Stan wins\n"); 35 else 36 printf("Ollie wins\n"); 37 } 38 else 39 { 40 if ((m*1.0)/n>((sqrt(5)+1)/2)) 41 printf("Stan wins\n"); 42 else 43 printf("Ollie wins\n"); 44 } 45 } 46 } 47 return 0; 48 }
以上是关于洛谷P1290 欧几里德的游戏 数学 博弈论 模拟的主要内容,如果未能解决你的问题,请参考以下文章