• 取石子游戏


    总时间限制: 
    1000ms
     
    内存限制: 
    65536kB
    描述

    有两堆石子,两个人轮流去取.每次取的时候,只能从较多的那堆石子里取,并且取的数目必须是较少的那堆石子数目的整数倍.最后谁能够把一堆石子取空谁就算赢. 
    比如初始的时候两堆石子的数目是25和7 

    25 7 --> 11 7 --> 4 7 --> 4 3 --> 1 3 --> 1 0
      选手1取   选手2取   选手1取   选手2取   选手1取

    最后选手1(先取的)获胜,在取的过程中选手2都只有唯一的一种取法。 
    给定初始时石子的数目,如果两个人都采取最优策略,请问先手能否获胜。

     

    输入
    输入包含多数数据。每组数据一行,包含两个正整数a和b,表示初始时石子的数目。
    输入以两个0表示结束。
    输出
    如果先手胜,输出"win",否则输出"lose"
    样例输入
    34 12
    15 24
    0 0
    样例输出
    win
    lose
    提示
    假设石子数目为(a,b)且a >= b,如果[a/b] >= 2则先手必胜,如果[a/b]<2,那么先手只有唯一的一种取法.
    [a/b]表示a除以b取整后的值.
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long LL;
     4 inline void swap(LL &x,LL &y){
     5     LL tmp;
     6     tmp=x; x=y; y=tmp;
     7 }
     8 LL cnt;
     9 inline void ser(LL,LL);
    10 int main(){
    11     for(;;){
    12         cnt=0;
    13         LL a,b;
    14         scanf("%lld%lld",&a,&b);
    15         if(a==b&&a==0) break;
    16         ser(a,b);
    17     }
    18     return 0;
    19 }
    20 inline void ser(LL a,LL b){
    21     if(a<b) swap(a,b);
    22     cnt++;
    23     if(double(a)/double(b)>=2.0000||a==b){
    24         if(cnt%2==1){
    25             cout<<"win"<<endl;
    26             return;
    27         }
    28         else{
    29             cout<<"lose"<<endl;
    30             return ;
    31         }
    32     }
    33     else{
    34         ser(a-b,b);
    35     }
    36 }
  • 相关阅读:
    【VB编程】05.MsgBox与InputBox函数
    【VBA编程】04.使用自定义数据类型
    【VBA编程】03.判断输入年份是否是闰年
    ubuntu终端颜色设置
    常用命令
    adbd cannot run as root in production builds的解决方法
    camera table表编译
    [Linux]history 显示命令执行的时间
    ubuntu下动态链接库的编译和使用实例
    xxx is not in the sudoers file.This incident will be reported.的解决方法
  • 原文地址:https://www.cnblogs.com/CXCXCXC/p/4912453.html
Copyright © 2020-2023  润新知