这个题看了一上午,一直没头绪,撞了东南西北墙,终于在中午看了解题报告。恍然大悟!
这个题的意思是这样的,只能从较大数中取较小数的倍数。到最后谁不能拿了,就视为失败。
我开始想找到一个数字的规律来解题,后来发现不行,接着又想尝试递归来模拟拿的步骤来写,又被自己否定了,终于看了解题报告。恍然大雾,明白了决策与影响控制对手的节奏。如果a/b>=2,则有两种选择来控制对手的行动,1种是将状态变为{a>b&&a/b=1}另一种是{a<b}。这样对手在两种情况下均只能有一种选择,而结果也只有两种,所以具有选择权的就会控制比赛结果。 也许大家在担心,是不是这下控制住了,下次就变了呢?大家不用担心这个,因为你给对手的选择永远只有一个,如果还有别的选择依然由自己来控制! 还有要找出来谁会优先掌握控制权。这题,对我有很大启发。感觉到了博弈的精髓,不给对手留机会。。。
1 #include <stdio.h> 2 int main() 3 { 4 int a,b,t,count; 5 while(scanf("%d%d",&a,&b)&&(a!=0||b!=0)) 6 { 7 if(a<b) 8 { 9 t=a;a=b;b=t; 10 } 11 if(b==0) 12 { 13 printf("Ollie wins\n"); 14 continue; 15 } 16 else if(a%b==0) 17 { 18 printf("Stan wins\n"); 19 continue; 20 } 21 count=0; 22 while(b!=0&&a/b==1) 23 { 24 count++; 25 a=a-b; 26 t=a;a=b;b=t; 27 } 28 if(count%2==0) 29 { 30 printf("Stan wins\n"); 31 } 32 else if(count%2==1) 33 { 34 printf("Ollie wins\n"); 35 } 36 } 37 return 0; 38 }