zoukankan      html  css  js  c++  java
  • 取石子游戏

    【题目描述】

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

    【题目链接】

        http://noi.openjudge.cn/ch0205/6266/

    【算法】

    1. 当前状态总可以用(a,b)表示,其中a = n*b + c,则共有三种情况:
      1. c = 0, 则当前手赢 
      2. n>=2,  由于对任意一种状态输赢是确定的,那么按当前手取到(b,c)状态对于当前手的输赢情况进行区分。若(b,c)状态会让当前手赢,则最优取法自然是n*b;反之,若当前手取到(b,c)会输,那么显然对方取到(b,c)也会输,所以当前手的最优取法自然是(n-1)*b。所以不论哪种情况,当前手的最优取法都能让他赢。
      3. n==1, c != 0,此时当前手只能取b,问题递归到接下去(b,c)的1,2,3情况

    【代码】

    #include <bits/stdc++.h>
    using namespace std;
    int a,b;
    bool dfs(int x,int y)
    {
        if(x%y==0||x/y>1) return 1;
        return !dfs(y,x-y);
    }
    int main()
    {
        while(cin>>a>>b&&a) {
            if(a<b) swap(a,b);
            if(dfs(a,b)) cout<<"win"<<endl;
            else cout<<"lose"<<endl;
        }
        return 0;
    }
  • 相关阅读:
    CCF NOI1079 合法C标识符
    CCF NOI1080 统计字符
    CCF NOI1076 进制转换
    CCF NOI1065 最小公倍数
    CCF NOI1139 高精度减法
    CCF NOI1138 高精度加法
    CCF NOI1115 找数
    CCF NOI1097 数列
    CCF NOI1089 高精度运算
    NUC1931 Problem D 区间素数【素数筛选】
  • 原文地址:https://www.cnblogs.com/Willendless/p/9347649.html
Copyright © 2011-2022 走看看