2024/5/28 P1247 取火柴游戲

取火柴游戲

題目描述

輸入 k k k k k k 個整數 n 1 , n 2 , ? , n k n_1,n_2,\cdots,n_k n1?,n2?,?,nk?,表示有 k k k 堆火柴棒,第 i i i 堆火柴棒的根數為
n i n_i ni?;接著便是你和計算機取火柴棒的對弈游戲。取的規則如下:每次可以從一堆中取走若干根火柴,也可以一堆全部取走,但不允許跨堆取,也不允許不取。

誰取走最后一根火柴為勝利者。

例如: k = 2 k=2 k=2 n 1 = n 2 = 2 n_1=n_2=2 n1?=n2?=2,A 代表你,P 代表計算機,若決定 A 先取:

  • A: ( 2 , 2 ) → ( 1 , 2 ) (2,2) \rightarrow (1,2) (2,2)(1,2),即從第一堆中取一根。
  • P: ( 1 , 2 ) → ( 1 , 1 ) (1,2) \rightarrow (1,1) (1,2)(1,1),即從第二堆中取一根。
  • A: ( 1 , 1 ) → ( 1 , 0 ) (1,1) \rightarrow (1,0) (1,1)(1,0)
  • P: ( 1 , 0 ) → ( 0 , 0 ) (1,0) \rightarrow (0,0) (1,0)(0,0)。P 勝利。

如果決定 A A A 后取:

  • P: ( 2 , 2 ) → ( 2 , 0 ) (2,2) \rightarrow (2,0) (2,2)(2,0)
  • A: ( 2 , 0 ) → ( 0 , 0 ) (2,0) \rightarrow (0,0) (2,0)(0,0)。A 勝利。

又如 k = 3 k=3 k=3 n 1 = 1 n_1=1 n1?=1 n 2 = 2 n_2=2 n2?=2 n 3 = 3 n_3=3 n3?=3 A A A 決定后取:

  • P: ( 1 , 2 , 3 ) → ( 0 , 2 , 3 ) (1,2,3) \rightarrow (0,2,3) (1,2,3)(0,2,3)
  • A: ( 0 , 2 , 3 ) → ( 0 , 2 , 2 ) (0,2,3) \rightarrow (0,2,2) (0,2,3)(0,2,2)
  • A 已將游戲歸結為 ( 2 , 2 ) (2,2) (2,2) 的情況,不管 P 如何取 A 都必勝。

編一個程序,在給出初始狀態之后,判斷是先取必勝還是先取必敗,如果是先取必勝,請輸出第一次該如何取。如果是先取必敗,則輸出 lose

輸入格式

第一行,一個正整數 k k k

第二行, k k k 個整數 n 1 , n 2 , ? , n k n_1,n_2,\cdots,n_k n1?,n2?,?,nk?

輸出格式

如果是先取必勝,請在第一行輸出兩個整數 a , b a,b a,b,表示第一次從第 b b b 堆取出 a a a
個。第二行為第一次取火柴后的狀態。如果有多種答案,則輸出 ? b , a ? \lang b,a\rang ?b,a? 字典序最小的答案( 即 b b b 最小的前提下,使
a a a 最小)。

如果是先取必敗,則輸出 lose

樣例 #1

樣例輸入 #1

3 3 6 9

樣例輸出 #1

4 3 3 6 5

樣例 #2

樣例輸入 #2

4 15 22 19 10

樣例輸出 #2

lose

提示

數據范圍及約定

對于全部數據, k ≤ 500000 k \le 500000 k500000 n i ≤ 1 0 9 n_i \le 10^9 ni?109

又是參加學校每日題的一天,熟練的點開了題目的算法標簽,想看看這個題我有沒有一點點涉獵(又是及時放棄的一天(bushi))一看:博弈論。瞬間想起了之前在b站刷到過卻放在收藏夾吃灰,于是決定好好看看而不是直接放棄(

讓我們分析分析這道題。經典的Nim游戲 P2197 【模板】Nim 游戲
首先我們需要認識到,僅有一堆棋子存在時,出現勝負決斷
在這里插入圖片描述

n=1: 先手全拿,先手必勝。

n=2:有兩種情況,一種可能相同,一種情況一堆比另一堆少(多)

    (m,m) 按照“有一學一,照貓畫貓”法,先手必輸。(m,M)先手先從多的一堆中拿出(M-m)個,此時后手面對(m,m)的局面先手必勝。

術語:正經人稱(m,m)的局面為奇異局勢
n=3:(m,m,M)先手必勝局,先手可以先拿M,之后變成了(m,m,0)的局面,是不是很熟悉~

(a1,a2,a3)的話,舉個例子(1,2,3),先手取完之后可能的局面為(0,2,3),(1,1,3),(1,0,3),(1,2,2),(1,2,1),(1,2,0)都是之前講過的,情況如下:
在這里插入圖片描述
在這里插入圖片描述
這些的結果可以總結為:異或均為0

這塊的異或到底是怎么躥出來的,我覺得洛谷題解有一篇說的挺有意思

異或有一個特殊的規律,就是一堆數異或時,若在同一個二進制位上1的個數是偶數,那么這一位異或起來以后是0,否則為1

二進制的話就是可以使用0/1表示所有數字

我們來看上一個游戲,我們將這兩堆的剩余的火柴數轉變成二進制。

發現我們先手取走一個數,就是改變其二進制為上的1的個數(只考慮奇偶性),而后手再去取的話就是將其奇偶性再變回來

然后我們再回去看為什么異或和是0時先手必輸,因為先手拿走了某些火柴時,我們可以根據其拿走火柴的二進制表示,在其他一堆中拿走一些一些數字,使得其異或和重新為0;

怎么搞呢? 我們可以拿走一些數,也就是減某一個數,使得先手拿完后,(啰嗦警告)

所有堆中的每個二進制上的一的個數的和,我們總可以通過加減一個數,達到在某一個二進制位的1的個數進行加一or減一的效果

使得某一位二進制上的1的個數變為偶數。

從而使得游戲又恢復到了一開始的局面
題解

在這里插入圖片描述
在這里插入圖片描述
先手必勝,即先手可以拿走一些火柴,使得后手必敗,而必敗態是火柴堆的異或和為零;那么我們求的,就是先手拿走一些火柴后,新的火柴堆異或和為零的方案。設原異或和為X
在這里插入圖片描述
在這里插入圖片描述
當(a2 xor X)<a2時,能取走火柴。

#include <iostream>
#include<algorithm>using namespace std;
int k, n[500100], x;int main()
{cin >> k;for (int i = 1; i <= k; i++){cin >> n[i];x ^= n[i];}if (x == 0) { cout << "lose"; return 0; }for (int i = 1; i <= k; i++){if ((n[i] ^ x) < n[i]){cout << n[i] - (n[i] ^ x) << " " << i << endl;n[i] = n[i] ^ x;break;}}for (int i = 1; i <= k; i++){cout << n[i] << " ";}return 0;
}

這里貼一下感覺比較推薦的有關文章
數學知識——博弈論(巴什博奕、尼姆博奕、威佐夫博奕)思路及例題
題解 P1247 【取火柴游戲】
[學習筆記] (博弈論)Nim游戲和SG函數

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

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

相關文章

定點化和模型量化(三)

量化解決的是訓練使用的浮點和運行使用的硬件只支持定點的矛盾。這里介紹一些實際量化中使用到的工具。 SNPE簡介 The Snapdragon Neural Processing Engine (SNPE)是高通驍龍為了加速網絡模型設計的框架。但它不只支持高通&#xff0c;SNPE還支持多種硬件平臺&#xff0c;AR…

Beego 使用教程 8:Session 和 Cookie

beego 是一個用于Go編程語言的開源、高性能的 web 框架 beego 被用于在Go語言中企業應用程序的快速開發&#xff0c;包括RESTful API、web應用程序和后端服務。它的靈感來源于Tornado&#xff0c; Sinatra 和 Flask beego 官網&#xff1a;http://beego.gocn.vip/ 上面的 be…

抄表營收系統是什么?

1.抄表營收系統的概念和功能 抄表營收系統是一種自動化軟件&#xff0c;主要運用于公用事業公司(如電力工程、水、天然氣等)管理方法其服務的計量檢定、計費和收付款全過程。該系統根據集成化智能儀表、遠程控制數據收集和分析功能&#xff0c;提高了效率&#xff0c;降低了人…

(十)Python3 接口自動化測試,測試結果發送郵件

(十)Python3 接口自動化測試,測試結果發送郵件 1.前言 Windows本地執行的話,可自行編寫發送郵件方法發送郵件。 Jenkins執行的話,可用jenkins配套郵件發送郵件。 2.發送郵件示例 # -*- coding: utf-8 -*- # 主程序 import sys sys.path.append(./server) sys.path.appe…

人臉識別——探索戴口罩對人臉識別算法的影響

1. 概述 人臉識別是一種機器學習技術&#xff0c;廣泛應用于各種領域&#xff0c;包括出入境管制、電子設備安全登錄、社區監控、學校考勤管理、工作場所考勤管理和刑事調查。然而&#xff0c;當 COVID-19 引發全球大流行時&#xff0c;戴口罩就成了日常生活中的必需品。廣泛使…

反射機制大揭秘-進階Java技巧,直擊核心!

反射在Java中扮演著重要的角色&#xff0c;掌握了反射&#xff0c;就等于掌握了框架設計的鑰匙。本文將為您逐步講解反射的基本概念、獲取Class對象的三種方式、使用反射實例化對象并操作屬性和方法&#xff0c;還有解析包的相關內容。跟隨我一起探索反射的奧秘&#xff0c;提升…

使用 Ubuntu + Docker + Vaultwarden + Tailscale 自建密碼管理器

使用 Ubuntu Docker Vaultwarden Tailscale 自建密碼管理器 先決條件 一臺運行 Ubuntu 系統的服務器。可以是云提供商的 VPS、家庭網絡中的樹莓派、或者 Windows 電腦上的虛擬機等等 一個 Tailscale 賬戶。如果還沒有 Tailscale 賬戶&#xff0c;可以通過此鏈接迅速創建一個…

SelfKG論文翻譯

SelfKG: Self-Supervised Entity Alignment in Knowledge Graphs SelfKG&#xff1a;知識圖中的自監督實體對齊 ABSTRACT 實體對齊旨在識別不同知識圖譜&#xff08;KG&#xff09;中的等效實體&#xff0c;是構建網絡規模知識圖譜的基本問題。在其發展過程中&#xff0c;標…

華納云:MAC電腦怎么遠程連接Windows服務器桌面?

在Mac電腦上遠程連接Windows服務器桌面可以通過多種方式實現&#xff0c;最常用的方法是使用微軟提供的免費應用程序 "Microsoft Remote Desktop"。以下是詳細的步驟來設置和使用該工具&#xff1a; 步驟一&#xff1a;下載和安裝 Microsoft Remote Desktop 打開App …

SpringBoot的自動裝配

我們今天再來說一下關于 SpringBoot 的自動裝配&#xff0c;為什么會有這樣的問題呢&#xff1f;一般這種情況都是在面試的過程中&#xff0c;面試官有時候會問到這個問題&#xff0c;就比如從開始問SpringBoot 的一些常用注解&#xff0c;到SpringBoot的一些特性&#xff0c;然…

zynq之UART

之前嘗試UART0&#xff08;MIO50、51&#xff09;&#xff0c;串口調試助手收到發送的內容。 現在板子上EMIO端有多個串口&#xff0c;所以看看這個怎么弄。 串口是484的轉接板&#xff08;接232的串口就會輸出亂碼&#xff09; https://blog.51cto.com/u_15262460/2882973 …

【九十三】【算法分析與設計】719. 找出第 K 小的數對距離,N 臺電腦的最長時間,二分答案法

719. 找出第 K 小的數對距離 - 力扣&#xff08;LeetCode&#xff09; 數對 (a,b) 由整數 a 和 b 組成&#xff0c;其數對距離定義為 a 和 b 的絕對差值。 給你一個整數數組 nums 和一個整數 k &#xff0c;數對由 nums[i] 和 nums[j] 組成且滿足 0 < i < j < nums.le…

java調用遠程接口下載文件

在postman中這樣下載文件 有時下載文件太大postman會閃退&#xff0c;可以通過代碼下載&#xff0c;使用hutool的http包

3步操作助您輕松實現蘋果手機照片一鍵傳輸至電腦

對于很多使用蘋果手機的用戶來說&#xff0c;隨著手機中照片和視頻數量的不斷積累&#xff0c;如何將這些珍貴的回憶從手機轉移到電腦&#xff0c;以便更好地保存、整理和分享&#xff0c;成為了一個值得關注的問題。那么&#xff0c;蘋果手機怎么把照片導入電腦呢&#xff1f;…

鴻蒙課程培訓 | 訊方技術與鴻蒙生態服務公司簽約,成為鴻蒙鉆石服務商

3月15日&#xff0c;深圳市訊方技術股份有限公司與鴻蒙生態服務公司簽署合作協議&#xff0c;訊方技術成為鴻蒙鉆石服務商&#xff0c;正式進軍鴻蒙原生應用培訓開發領域。訊方技術總裁劉國鋒、副總經理劉銘皓、深圳區域總經理張松柏、深圳區域交付總監張梁出席簽約儀式。 作…

鄉村振興的鄉村產業創新發展:培育鄉村新興產業,打造鄉村產業新名片,促進鄉村經濟多元化發展

目錄 一、引言 二、鄉村產業創新發展的必要性 &#xff08;一&#xff09;適應新時代發展要求 &#xff08;二&#xff09;滿足消費升級需求 &#xff08;三&#xff09;促進農民增收致富 三、培育鄉村新興產業策略 &#xff08;一&#xff09;加強科技創新引領 &#…

在 MFC 中 UNICODE 加 _T 與 L 長字符串,有什么區別?

在MFC&#xff08;Microsoft Foundation Classes&#xff09;和更廣泛的Windows編程環境中&#xff0c;UNICODE宏用于指示程序應使用Unicode字符集&#xff08;通常是UTF-16&#xff09;來處理文本。當定義了UNICODE宏時&#xff0c;編譯器和庫函數會期待和處理寬字符&#xff…

Android下HWC以及drm_hwcomposer普法((上)

Android下HWC以及drm_hwcomposer普法((上) 引言 按摩得全套&#xff0c;錯了&#xff0c;做事情得全套&#xff0c;普法分析也是如此。drm_hwcomposer如果對Android圖形棧有一定研究的童鞋們應該知道它是Android提供的一個的圖形后端合成處理HAL模塊的實現。但是在分析這個之前…

Java復習-集合篇

集合 集合分為倆大類 單列集合 每個元素數據只包含一個值 雙列集合 每個元素包含倆個鍵值對 Conllection單列集合 單列集合常用的主要是下列幾種 List集合 List系列集合的特點&#xff1a;添加元素是有序、可重復、有索引 這里我們來試一下ArrayList ArrayList<String&g…

Spring OAuth2:開發者的安全盾牌!(上)

何利用Spring OAuth2構建堅不可摧的安全體系&#xff1f;如何使用 OAuth2 從跨域挑戰到性能優化&#xff0c;每一個環節都為你的應用保駕護航&#xff1f; 文章目錄 Spring OAuth2 詳解1. 引言簡述OAuth2協議的重要性Spring Framework對OAuth2的支持概述 2. 背景介紹2.1 OAuth2…