ZOJ 3964 Yet Another Game of Stones Nim游戏变种

ZOJ3964

解题思路

此题的题意比较容易理解,可以简单的看着 Nim 博弈的变种。但问题在于 Alice 对第 i 堆石子的取法必须根据 bi 确定。所以如果这个问题能够归结到正常的 Nim 博弈(取石子问题),则很容易解决。

考虑特判存在 bi=1 或 bi=2 的情况:

  • 如果存在第 i 堆石子,其 ai 为奇数且 bi=2 ,则 Bob 必胜(Alice 在最优策略下无法取完该堆,但 Bob 可以)。
  • 如果存在 2 个及以上 bi=2 或 bi=1 且 ai>1 的情况,则 Bob 必胜。
  • 如果只有一个 bi=2 (其余都为 bx=0 ) 的情况,则 Alice 为了胜利,必须先将该堆石子取完(否则 Bob 只需取掉该堆 1 个石子, Bob 必胜)。此时问题等同于 n-1 堆石子,Bob 先手的 Nim 博弈。
  • 如果只有一个 bi=1 且 ai>1 (其余都为 bx=0 )的情况,Alice 同样需先将该堆石子取完(或只剩一个)。此时问题等同于 n-1(n) 堆石子,Bob 先手的 Nim 博弈。

对于只有 bi=0 的情况,Nim 博弈全部 ai 异或即可。

经典的Nim游戏 只要连续取异或XOR就可以判断胜负状态。

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int a[N], b[N], n;
bool jug()
{
    int cnt[3] = {0, 0, 0}, tot = 0;
    for(int i=1;i<=n;i++)
    {
        if(a[i]%2 && b[i] == 2) return false;
        if(b[i] == 2)   cnt[2]++,   cnt[0]++;
        if(a[i] > 1 && b[i] == 1)   cnt[1]++,   cnt[0]++;
    }
    if(cnt[0]>1)    return false;
    if(cnt[1] == 1) {
        for(int i=1;i<=n;i++)
            if(b[i] == 1 && a[i] > 1)   tot ^= (a[i]%2?0:1);
            else    tot ^= a[i];
        return !(tot?1:0);
    }
    else if(cnt[2] == 1) {
        for(int i=1;i<=n;i++)
            if(b[i] != 2)
                tot ^= a[i];
        return !(tot?1:0);
    }
    else {
        for(int i=1;i<=n;i++)
            tot ^= a[i];
        return tot;
    }
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        for(int i=1;i<=n;i++)
            scanf("%d",&b[i]);
        printf("%s\n", jug() ? "Alice" : "Bob");
    }
}

  

时间: 2024-11-07 09:49:00

ZOJ 3964 Yet Another Game of Stones Nim游戏变种的相关文章

uva 1482 - Playing With Stones(Nim游戏)

题目链接: uva 1482 - Playing With Stones 题目大意:n堆石子,给定每堆石子的个数,两个人分别从操作,每次可以从一堆中取走至少一个石子,但是不能超过一半.如果不能操作则视为失败. 解题思路:对于每一堆式子来说,可以看作一个Nim游戏,但是SG(x)并不等于x,因为每次取石子不能超过一半,所以对于偶数SG(x)=x/2,对于奇数SG(x)=SG(x/2). 所以去Nim和即可. #include <cstdio> #include <cstring> #

Nim游戏变种——取纽扣游戏

(2016腾讯实习生校招笔试题)Calvin和David正在玩取纽扣游戏,桌上一共有16个纽扣,两人轮流来取纽扣,每人每次可以选择取1个或3个或6个(不允许不取),谁取完最后的纽扣谁赢.Cavin和David都非常想赢得这个游戏,如果Cavin可以先取,Cavin的必胜策略下第一步应该取 A.1个 B.3个 C.6个 D.Cavin没有必胜策略 解析:这道题是Nim游戏的变种,Nim游戏是博弈论中最经典的模型(之一). 根据博弈论的性质:对于巴什博弈,存在必胜点和必败点,是指在当前这个点上的先手

LeetCode 292 Nim Game(Nim游戏)

翻译 你正在和你的朋友们玩以下这个Nim游戏:桌子上有一堆石头.每次你从中去掉1-3个.谁消除掉最后一个石头即为赢家.你在取出石头的第一轮. 你们中的每个人都有着聪明的头脑和绝佳的策略.写一个函数来确定对于给定的数字是否你能够赢得这场比赛. 比如,假设堆中有4个石头,那么你永远也无法赢得比赛:不管你移除了1.2或3个石头,最后一个石头都会被你的朋友所移除. 原文 You are playing the following Nim Game with your friend: There is a

[Swift]LeetCode292. Nim游戏 | Nim Game

You are playing the following Nim Game with your friend: There is a heap of stones on the table, each time one of you take turns to remove 1 to 3 stones. The one who removes the last stone will be the winner. You will take the first turn to remove th

BZOJ 3105: [cqoi2013]新Nim游戏

3105: [cqoi2013]新Nim游戏 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1064  Solved: 624[Submit][Status][Discuss] Description 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴.可以只拿一根,也可以拿走整堆火柴,但不能同时从超过一堆火柴中拿.拿走最后一根火柴的游戏者胜利. 本题的游

Nim 游戏、SG 函数、游戏的和

Nim游戏 Nim游戏定义 Nim游戏是组合游戏(Combinatorial Games)的一种,准确来说,属于"Impartial Combinatorial Games"(以下简称ICG).满足以下条件的游戏是ICG(可能不太严谨):1.有两名选手:2.两名选手交替对游戏进行移动(move),每次一步,选手可以在(一般而言)有限的合法移动集合中任选一种进行移动:3.对于游戏的任何一种可能的局面,合法的移动集合只取决于这个局面本身,不取决于轮到哪名选手操作.以前的任何操作.骰子的点数

HDU 5465 Clarke and puzzle Nim游戏+二维树状数组

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5465 Clarke and puzzle Accepts: 42 Submissions: 269 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) 问题描述 克拉克是一名人格分裂患者.某一天,有两个克拉克(aa和bb)在玩一个方格游戏. 这个方格是一个n*mn∗m的矩阵,每个格子里有一

HDU_1907_基础博弈nim游戏

John Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 4440    Accepted Submission(s): 2541 Problem Description Little John is playing very funny game with his younger brother. There is one big bo

3105: [cqoi2013]新Nim游戏 异或高消 &amp;&amp; 拟阵

3105: [cqoi2013]新Nim游戏 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 535  Solved: 317[Submit][Status][Discuss] Description 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴.可以只拿一根,也可以拿走整堆火柴,但不能同时从超过一堆火柴中拿.拿走最后一根火柴的游戏者胜利. 本题的游戏