算法學習筆記(Nim游戲)

N i m Nim Nim游戲

n n n堆物品,每堆有 a i a_i ai?個,每個玩家輪流取走任意一堆的任意個物品,但不能不取,取走最后一個物品的人獲勝。

N i m Nim Nim游戲是一種經典的公平組合游戲。現在對它進行分析。

首先定義兩個博弈中的狀態:

  • 必勝狀態:先手必勝的狀態。
  • 必敗狀態:先手必敗的狀態。

對于這兩個狀態,我們可以知道:

  1. 沒有后繼狀態的狀態必然是必敗狀態。在這個狀態中先手的是敗者,因為他無法通過操作將游戲進行下去了。
  2. 一個狀態是必勝狀態當且僅當存在至少一個必敗狀態為它的后繼狀態。在這個狀態中先手的人可以通過一次操作讓對手在必敗狀態中先手。
  3. 一個狀態的所有后繼狀態均為必勝狀態,那么這個狀態為必敗狀態。在這個狀態中先手,無法避免讓對方在必勝狀態中先手。

回到 N i m Nim Nim游戲:

N i m Nim Nim游戲中,一個很顯然的必敗狀態就是所有物品堆中物品的數量都為 0 0 0,即 [ 0 , 0 , . . . , 0 ] [0, 0, ..., 0] [0,0,...,0]。這個狀態也是最終態。可以知道,在最終態時,所有物品堆中的物品數量的異或和是等于 0 0 0的,我們不妨假設狀態和物品數量的異或和有關系。

證明有關:

一個非 0 0 0的異或和,產生最高位的 1 1 1總需要有奇數個數字來提供對應位置的 1 1 1。而我們為了消去這個 1 1 1,可以選擇任意一個提供這個 1 1 1的數字,使其二進制中該位上的數字為 0 0 0,而且修改最高位為 0 0 0后得到的數字永遠小于原來的數字,也就是說,我們可以任意修改其他位上的數字從而使得全部物品數量的異或和為 0 0 0

而對于一個為 0 0 0的異或和,假設存在一個 b =? a i b \not = a_i b=ai?使得我們將 a i a_i ai?修改為 b b b后,異或和還是為 0 0 0,則有 0 ⊕ a i ⊕ b = 0 0 \oplus a_i \oplus b = 0 0ai?b=0,為了使這個式子成立 b b b就要等于 a i a_i ai?,與假設違背。

換句話說,對于一個物品數量異或和不為 0 0 0的狀態,我們可以通過一次操作將物品數量的異或和修改為 0 0 0,而對于一個物品數量異或和為 0 0 0的操作,我們無法只通過一次操作保持物品數量的異或和不變。

從上可以得出,在 N i m Nim Nim游戲中,物品數量異或和為 0 0 0的狀態是必敗狀態,物品數量異或和不為 0 0 0的狀態是必勝狀態。

接下來看例題:

【模板】Nim 游戲

【模板】Nim 游戲

題目描述

甲,乙兩個人玩 nim 取石子游戲。

nim 游戲的規則是這樣的:地上有 n n n 堆石子(每堆石子數量小于 1 0 4 10^4 104),每人每次可從任意一堆石子里取出任意多枚石子扔掉,可以取完,不能不取。每次只能從一堆里取。最后沒石子可取的人就輸了。假如甲是先手,且告訴你這 n n n 堆石子的數量,他想知道是否存在先手必勝的策略。

輸入格式

本題有多組測試數據。

第一行一個整數 T T T T ≤ 10 T\le10 T10),表示有 T T T 組數據

接下來每兩行是一組數據,第一行一個整數 n n n,表示有 n n n 堆石子, n ≤ 1 0 4 n\le10^4 n104

第二行有 n n n 個數,表示每一堆石子的數量.

輸出格式

T T T 行,每行表示如果對于這組數據存在先手必勝策略則輸出 Yes,否則輸出 No

樣例 #1

樣例輸入 #1

2
2
1 1
2
1 0

樣例輸出 #1

No
Yes

根據剛才的推論,我們只需要計算所有數字的異或和,就可以得出先手時處在必勝狀態還是必敗狀態。用 O ( n ) O(n) O(n)的復雜度即可得出最后的勝負結果。

#include<bits/stdc++.h>
using namespace std;void solve()
{int n; cin >> n;int ans = 0;for(int i = 1; i <= n; ++i){int x; cin >> x;ans ^= x;}cout << (ans ? "Yes" : "No") << '\n';
}int main()
{ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);int _; cin >> _;while(_--) solve();return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/10662.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/10662.shtml
英文地址,請注明出處:http://en.pswp.cn/web/10662.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Chisel】chisel中怎么處理類似verilog的可變位寬和parameter

在 Chisel 中處理可變位寬和參數的方式與 Verilog 有一些不同&#xff0c;因為 Chisel 是建立在 Scala 語言之上的。以下是如何在 Chisel 中處理這些概念的方法&#xff1a; 參數化&#xff08;Parameters&#xff09; 在 Chisel 中&#xff0c;參數化是通過在模塊構造函數中定…

VUE使用餓了么的上傳組件時實現圖片預覽

創作靈感 最近在寫項目時&#xff0c;遇到了上傳頭像的需求&#xff0c;我使用的是element組件中的upload組件。但是在使用時&#xff0c;我需要實現預覽、手動上傳頭像等功能。然而在使用餓了么組件時&#xff0c;這些功能還是需要我們自己去手動實現的&#xff0c;在手動實現…

Linux makefile進度條

語法 在依賴方法前面加上就不會顯示這一行的命令 注意 1.make 會在當前目錄下找名為“makefile” 或者 “Makefile” 的文件 2.為了生成第一依賴文件&#xff0c;如果依賴文件列表有文件不存在&#xff0c;則會到下面的依賴關系中查找 3..PHONY修飾的依賴文件總是被執行的 …

Redis——RDB、AOF和混合持久化機制

Redis提供了三種持久化機制來確保數據的持久保存&#xff0c;分別是RDB&#xff08;Redis DataBase&#xff09;、AOF&#xff08;Append Only File&#xff09;和混合持久化。 RDB&#xff08;Redis DataBase&#xff09; RDB持久化機制是將Redis在內存中的數據保存到磁盤上的…

xss-lab 1-18關payload

Less-1 ?name<script>alert()</script> Less-2 "><script>alert()</script> "οnclick"alert() " οnfοcus"alert() " οnblur"alert() Less-3 οnfοcusalert() οnbluralert() οnfοcusjavascript:aler…

Spring AopUtils深度解析:從入門到精通的全方位指南

1. 概述 AopUtils是Spring框架中的一個工具類&#xff0c;主要用于處理AOP&#xff08;面向切面編程&#xff09;相關的操作。它提供了一系列靜態方法&#xff0c;幫助開發者更方便地處理AOP中的對象、代理以及通知&#xff08;Advice&#xff09;等。 2. 用途 AopUtils的主要…

操作系統原理與系統——實驗十三多道批處理作業調度(作業可移動)

關鍵代碼 #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct data{int hour;//當前小時int min;//當前分鐘 }time; struct node{char name[20];//進程名time arrive;//到達就緒隊列時間int zx;//執行時間(預期時間)int size;int ta…

Polygon市值機器人

隨著區塊鏈技術的蓬勃發展和數字貨幣市場的日益繁榮&#xff0c;投資者們對于如何精準把握市場動態、實現資產穩健增長的需求愈發迫切。在這個背景下&#xff08;市值管理飛//機//aishutuyu&#xff09;&#xff0c;Polygon市值機器人應運而生&#xff0c;作為一款基于Polygon公…

LeetCode 第397場周賽個人題解

目錄 100296. 兩個字符串的排列差 原題鏈接 思路分析 AC代碼 100274. 從魔法師身上吸取的最大能量 原題鏈接 思路分析 AC代碼 100281. 矩陣中的最大得分 原題鏈接 思路分析 AC代碼 100312. 找出分數最低的排列 原題鏈接 思路分析 AC代碼 100296. 兩個字符串的排…

timerfd加epoll封裝定時器

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 1、用timerfd加epoll封裝定時器的優點2、代碼實現 1、用timerfd加epoll封裝定時器的優點 定時器為什么需要timerfd 在設計定時器時&#xff0c;我們首先想到的就是…

【SpringBoot】Redis Lua腳本實戰指南:簡單高效的構建分布式多命令原子操作、分布式鎖

文章目錄 一.Lua腳本1.Lua特性2.Lua優勢 二.Lua語法1.注釋2.變量3.數據類型&#xff1a;3.1.基本類型3.2.對象類型&#xff1a;表&#xff08;table&#xff09; 4.控制結構&#xff1a;4.1.條件語句: 使用if、else和elseif來實現條件分支。4.2.循環結構&#xff1a;Lua支持for…

Shell參數擴展形式學習筆記

Shell參數擴展形式學習筆記 文章目錄 Shell參數擴展形式學習筆記空值判斷處理 ${parameter:-word} ${parameter:word} ${parameter:?word} ${parameter:word}變量位置截取 ${parameter:offset} ${parameter:offset:length}變量匹配組合 ${!prefix*} ${!prefix} ${!name[]} ${!…

感知機和神經網絡

引入 什么是神經網絡&#xff1f; 我們今天學習的神經網絡&#xff0c;不是人或動物的神經網絡&#xff0c;但是又是模仿人和動物的神經網絡而定制的神經系統&#xff0c;特別是大腦和神經中樞&#xff0c;定制的系統是一種數學模型或計算機模型&#xff0c;神經網絡由大量的人…

圖像處理:圖像噪聲添加

文章目錄 前言一、高斯噪聲二、椒鹽噪聲三、泊松噪聲四、斑點噪聲五、指數噪聲六、均勻噪聲總結 前言 本文主要介紹幾種添加圖像噪聲的方法&#xff0c;用于數據增強等操作。 以下圖為例。 一、高斯噪聲 高斯噪聲就是給圖片添加一個服從高斯分布的噪聲&#xff0c;可以通過調…

vLLM初探

vLLM是伯克利大學LMSYS組織開源的大語言模型高速推理框架&#xff0c;旨在極大地提升實時場景下的語言模型服務的吞吐與內存使用效率。vLLM是一個快速且易于使用的庫&#xff0c;用于 LLM 推理和服務&#xff0c;可以和HuggingFace 無縫集成。vLLM利用了全新的注意力算法「Page…

Python+PySpark數據計算

1、map算子 對RDD內的元素進行逐個處理&#xff0c;并返回一個新的RDD&#xff0c;可以使用lambda以及鏈式編程&#xff0c;簡化代碼。 注意&#xff1a;再python中的lambda只能有行&#xff0c;如果有多行&#xff0c;要寫成外部函數&#xff1b;&#xff08;T&#xff09;-&…

train_gpt2_fp32.cu - cudaCheck

源碼 // CUDA error checking void cudaCheck(cudaError_t error, const char *file, int line) {if (error ! cudaSuccess) {printf("[CUDA ERROR] at file %s:%d:\n%s\n", file, line,cudaGetErrorString(error));exit(EXIT_FAILURE);} }; 解釋 該函數用于檢查CU…

無人機路徑規劃:基于鯨魚優化算法WOA的復雜城市地形下無人機避障三維航跡規劃,可以修改障礙物及起始點(Matlab代碼)

一、部分代碼 close all clear clc rng(default); %% 載入數據 data.S[50,950,12]; %起點位置 橫坐標與縱坐標需為50的倍數 data.E[950,50,1]; %終點點位置 橫坐標與縱坐標需為50的倍數 data.Obstaclexlsread(data1.xls); data.numObstacleslength(data.Obstacle(:,1)); …

連接和斷開與服務器的連接

要連接到服務器&#xff0c;通常需要在調用mysql時提供一個MySQL用戶名&#xff0c;很可能還需要一個密碼。如果服務器在除了登錄的計算機之外的機器上運行&#xff0c;您還必須指定主機名。聯系您的管理員以找出應該使用哪些連接參數來連接&#xff08;即使用哪個主機、用戶名…

TypeError: can only concatenate str (not “int“) to str

TypeError: can only concatenate str (not "int") to str a 窗前明月光&#xff0c;疑是地上霜。舉頭望明月&#xff0c;低頭思故鄉。 print(str_len len(str_text) : len(a)) 試圖打印出字符串 a 的長度&#xff0c;但是在 Python 中拼接字符串和整數需要使用字符…