标签:and perfect hang include etc start while esc 博弈
题目给出了两个正数a.b
每次操作,大的数减掉小的数的整数倍。一个数变为0 的时候结束。
谁先先把其中一个数减为0的获胜。问谁可以赢。Stan是先手。
思路:我们把a当成是大的数(当b比a小就交换),a要减b的倍数直到减到a<b也就是a=a%b,需要的步骤可能有a/b种,我们拿样例来说:34和12需要34/12=2步,然后是34%12=10,12,此时需要12/10=1步,此时变成10,2。这样5次就能够减成0了。
显然我们可以把这个看做有3堆石子,分别为2,1,5,每次两个人能轮流在一堆中拿任意个但必须得从第一堆开始往后那(拿完一堆才能拿第二堆)
我们只需导论下情况:
1两个人谁先遇到堆里石子个数大于1的谁就能赢
2.如果所有堆的石子个数都等于1,那么就看堆数的奇偶。
#include <iostream> #include <stdio.h> #include <math.h> #include <algorithm> #include <vector> using namespace std; int main() { int a,b,t; vector<int > v; while(scanf("%d%d",&a,&b)&&(a>0||b>0)) { v.clear(); if(a<b) { t=a; a=b; b=t; } while(a%b!=0) { v.push_back(a/b); t=a%b; a=b; b=t; } int flag=0; for(int i=0;i<v.size();i++) { if(i%2==0&&v[i]>1) { flag=1; break; } if(i%2==1&&v[i]>1) { flag=2; break; } } if(flag==1) printf("Stan wins\n"); else if(flag==2) printf("Ollie wins\n"); else{ if(v.size()%2==0) printf("Stan wins\n"); else printf("Ollie wins\n"); } } return 0; }
标签:and perfect hang include etc start while esc 博弈
原文地址:http://www.cnblogs.com/yuanbo123/p/6763821.html