标签:clu process play star swa gcd player line one
Description
25 7
11 7
4 7
4 3
1 3
1 0
Input
Output
Sample Input
34 12 15 24 0 0
Sample Output
Stan wins Ollie wins
------------------------------------------------------------------
题意:两个人在玩一个类似gcd的游戏,从两个数中不断用较大数中减去较小数的倍数,谁先得到0谁获胜,问谁赢。
分析:一开始还以为是要跑gcd,然而还是太naive了。看了一下《挑战》,总结了一下思路。
{策略1}:对于(a,b)(a>b)来说,如果a是b的倍数,那么肯定当前者赢。
{策略2}:对于(a,b)(a>b)来说,如果a<2*b,那么意味着下一个状态必定是(b,a-b),因为此时a不可能减去更多倍的b,以此类推之后,永远不会出现a%b==0的情况,因为如果能出现的话,策略1就会将其判定了。那么肯定当前者赢。
用上策略1和策略2就AC了。
1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 int main() 5 { 6 long long a,b;//f=1表示stan赢 7 while( scanf("%lld%lld",&a,&b)==2 && a!=0 && b!=0 ) 8 { 9 int f=1; 10 while(1) 11 { 12 if(a>b) swap(a,b); 13 if(b%a==0) break;//策略1 14 if(b-a>a) break;//策略2 15 b-=a; 16 f*=-1; 17 } 18 if(f==1) printf("Stan wins\n"); 19 else printf("Ollie wins\n"); 20 } 21 return 0; 22 }
标签:clu process play star swa gcd player line one
原文地址:http://www.cnblogs.com/noblex/p/7577488.html