zoukankan      html  css  js  c++  java
  • (zst的博弈) 【推理+找规律】

    题目:

    甲乙两人玩一个游戏: 一张卡片上有个数字,甲乙两人轮流操作, 若当前卡片上的数字为x, 每次操作可以把它变为x+1或2x, 且不能超过n (例如n=8,x=6,只能变为7而不能变为12), 每次甲首先在卡片上写1,规定写n的人获胜。给定n, 问甲是否有必胜策略?


    分析:
    看起来像一道博弈论的题,但实际上仅需细心的推理,耐心的找规律即可。
     
    1、因为甲先写的1,所以乙的所有奇数全部要从甲的偶数哪里加1得来,因此如果n为奇数,甲只要保证自己写的数全是      奇数即可,因此奇数的情况下,甲赢。
    2、发现因为从 n/2 到 n 两人只能一个一个加上去,因此从 n/2 到 n (n为偶数)中的所有偶数为必胜状态。而从 n/4 到       n/2 中的任何一个数乘以2均可跳到 n/2 到 n 的偶数状态,即为必胜状态,因此谁先写下 n/4  到 n/2 中的数,谁就必       胜。而只要某一个人写下了 n/4 ,对方虽然不会主动乘以2,但当他加了1以后,此人可立即乘以2跳到 n/2  至 n中       的偶数 ,因此谁写下 n/2 谁就必胜。
    综上:n/4 是一个必胜周期。
     
    参考代码:
     
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    int t;
    long long n;
    bool dfs(long long n)
    {
        if(n==2)
            return 0;
        else if(n%2)
            return 1;
        else
            return dfs(n/4);
    }
    
    int main()
    {
        cin>>t;
        while(t--)
        {
            cin>>n;
            bool f=dfs(n);
            if(f) cout<<"YES"<<endl;
            else cout<<"NO"<<endl;
        }
        return 0;
    }
    View Code
  • 相关阅读:
    多线程锁--怎么理解Condition
    ThreadPoolExecutor
    ThreadFactory
    java内部类的初始化
    Android Private Libraries 和 Dependencies的区别
    Android严苛模式StrictMode使用详解
    [法律法规]《网络安全等级保护条例(征求意见稿)》
    [法律法规]中华人民共和国网络安全法
    Sqlserver tablediff的简单使用
    Sqlserver 命令行方式修改 用户密码的方法
  • 原文地址:https://www.cnblogs.com/linda-fcj/p/7206129.html
Copyright © 2011-2022 走看看