zoukankan      html  css  js  c++  java
  • 博弈论 尼姆博弈,人生第一道博弈纪念一下

    John
    Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
    Total Submission(s): 5891 Accepted Submission(s): 3421

    Problem Description
    Little John is playing very funny game with his younger brother. There is one big box filled with M&Ms of different colors. At first John has to eat several M&Ms of the same color. Then his opponent has to make a turn. And so on. Please note that each player has to eat at least one M&M during his turn. If John (or his brother) will eat the last M&M from the box he will be considered as a looser and he will have to buy a new candy box.

    Both of players are using optimal game strategy. John starts first always. You will be given information about M&Ms and your task is to determine a winner of such a beautiful game.

    Input
    The first line of input will contain a single integer T – the number of test cases. Next T pairs of lines will describe tests in a following format. The first line of each test will contain an integer N – the amount of different M&M colors in a box. Next line will contain N integers Ai, separated by spaces – amount of M&Ms of i-th color.

    Constraints:
    1 <= T <= 474,
    1 <= N <= 47,
    1 <= Ai <= 4747

    Output
    Output T lines each of them containing information about game winner. Print “John” if John will win the game or “Brother” in other case.

    Sample Input
    2
    3
    3 5 1
    1
    1

    Sample Output
    John
    Brother

    这道题本应该昨天就补的,可是最近实在学不下去,昨天晚上去打忍村了,愧疚一天。
    这个题是尼姆博弈的变形题。
    题目大意如下:
    若干堆不同颜色的糖果,每次至少从某一堆去一个,取最后一个的人为输家。
    话不多说,放代码。

    #include <iostream>
    #include <cstring>
    using namespace std;
    int main(){
        int t;
        cin>>t;
        while(t--){
            int n;
            cin>>n;
            int a[50];
    
    
            memset(a,0,sizeof(a)); 
            int res=0;
            int count=0;
            for(int i=1;i<=n;i++){
                cin>>a[i];
                if(a[i]>1){
                    count++;
                }
                res=res^a[i];
            }
            res=res^0;
    
            if(res==0){
                if(count>=2){
                    cout<<"Brother"<<endl;//T2
                }
                else if(count==1){//不可能存在T1态 
                    cout<<""; 
                }
                else if(count==0){//T0 
                    cout<<"John"<<endl;
                }
    
            }else{
    
                if(count>=2){
                    cout<<"John"<<endl;//s2
                }
                else  if(count==1){
                    cout<<"John"<<endl;//s1
                }
                else if(count==0){
                    cout<<"Brother"<<endl;//s0
                }
            }
    
        }
    } 

    下面的链接是斌神的分析。
    https://www.cnblogs.com/kuangbin/archive/2011/08/28/2156426.html

  • 相关阅读:
    collections模块整理
    jQuery 事件
    前端开发问题点
    无线wifi
    MySQL 数据库--SQL语句优化
    MySQL 数据库--索引原理与慢查询优化
    MySQL 数据库--内置功能
    MySQL 数据库--权限管理
    MySQL -Naivacat工具与pymysql模块
    MySQL 数据库 -- 数据操作
  • 原文地址:https://www.cnblogs.com/bianzhuo/p/9463276.html
Copyright © 2011-2022 走看看