第十二屆藍橋杯 異或數列

原題:

https://www.acwing.com/problem/content/3424/

題目大意:?

A、B兩人的數初始值均為0,他們輪流從X數組中取數,可以將該數與自己的數或對方的數進行異或操作,A先手,當X中的數被取完的時候誰的數大誰贏。兩人每次的操作都是最優的。判斷最后是A贏還是B贏還是平局。

一般博弈的問題測試數據范圍都比較大,所以肯定要找規律,找到必勝態和必敗態

第一次做這種博弈問題,花了很長時間理解,所以記錄一下/(ㄒoㄒ)/~~。

1. 怎樣比較最終兩人的數字的大小?

比較a、b兩個二進制數的大小,可以從高位向低位逐位比較,當發現某一位數字不一樣時,就可以判斷a、b兩數的大小關系。

所以本題要對a、b最后的結果從高到低逐位比較

由于a, b初始均為0,0與任何數異或結果還是這個數,所以最終a, b都是X中的一些數異或起來的結果,而對兩個二進制數的某個對應位進行異或操作時不會影響到其他位,所以可以不管a, b最后的值具體是多少,直接從高到低逐位比較X數組中每個數。

例如,假設X = [1, 2, 3, 4, 5],就直接像下面這樣從高到低一位一位地比較,直到找到能分出勝負的那一位:

2. 怎樣分出勝負?

我們需要一位一位地看能不能分勝負。

異或運算時,0不能改變數,只有1才能改變。

以上面為例,這五個數中最高位有兩個1,兩個1能不能分勝負呢?

看上面的這張圖,初始時a,b的這一位都是0,當有一個人選了1,a或b的這一位就會發生改變(把1異或給自己或者對方),從上圖的(0,0)出發,沿著邊走兩次,要么還是(0, 0),要么變成(1, 1),所以這一位不能分出勝負。

其實我們也可以進一步看出,當這一位1有偶數個時,都不能分出勝負(從(0, 0)開始沿著邊走偶數次還是走到這兩位相同的地方)

當這一位的1有奇數個時:由于偶數個1的時候是平局,所以誰拿到最后一個1,誰就會贏(因為兩人都采用最佳策略,所以可以根據現在的狀態決定這個1給自己還是對方)。而誰能拿到最后那個1取決于0的個數

情況1:0有偶數個,例如:0 0 1 1 1,那么先手必勝,因為只要先拿走一個1,接下來后手就進入了一個雙偶的局面,不管后手拿什么都拿和他一樣的就行,都能拿到最后一個1

情況2:0有奇數個,例如:0 0 0 1 1 1,那么后手必勝,不管先手拿什么,都拿和他相反的,接下來就和上面類似,先手進入了雙偶的局面,后手只要一直跟先手拿一致的就能贏

還要注意一個特殊情況就是1只有一個,這時候不管0有幾個顯然先手必勝。

總結一下:

若某一位上1一共有偶數個,則這一位分不出勝負,繼續看下一位;

若某一位上1一共有奇數個,

當1有一個時,先手必勝;

當1不止一個時,若0有偶數個,則先手必勝;若0有奇數個,則后手必勝。

3. 用一個數組bits統計X中的數每一位上1的總個數

分析了勝負情況后,很自然地就要統計出每一位上所有Xi的1的個數,例如上面X = [1,2,3,4,5]的例子中,bits[0] = 3, bits[1] = 2, bits[3] = 2(從低位到高位統計)。

先定義一個函數處理單個數,之后再一個一個地處理,這段代碼如下:

def get_bit(num):  # 處理單個數哪一位是1,并累加到bits里idx = 0  # 指示bits數組的索引while num:bit = num & 1  # num和1與一下,就能獲得最低位是多少bits[idx] += bit # 這一位的值累加到bits數組對應的位上,可以得到1的個數num >>= 1  # 右移一位,處理num的更高一位idx += 1   # 索引加1

題目中Xi最大是2的20次方,也就是最多用21位表示,所以bits初始化為[0] * 21。

最后是我的ac code:

def get_bit(num):idx = 0while num:bit = num & 1bits[idx] += bitnum >>= 1idx += 1t = int(input())
for _ in range(t):tmp = list(map(int, input().split()))len_x = tmp[0]x = tmp[1:]bits = [0] * 21for xi in x:   # 統計Xi中的數每一位總共有幾個1get_bit(xi)ans = 0for i in range(20, -1, -1):  # 從高到低比較,所以要倒序遍歷if bits[i] % 2 == 0:  # 有偶數個1continueelse:       # 有奇數個1if bits[i] == 1:  # 有1個1ans = 1elif (len_x - bits[i]) % 2 == 0: # 有偶數個0ans = 1elif (len_x - bits[i]) % 2 == 1: # 有奇數個0ans = -1breakprint(ans)

思路參考:http://【寒假每日一題07 | 【藍橋杯省賽】異或數列 StarryCoding.109】https://www.bilibili.com/video/BV1wr421s73c?vd_source=9c4a17fd87c2018d071c433adb917522

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

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

相關文章

微服務的認識與拆分

微服務架構通過將應用分解為一組小的、獨立的服務來實現,每個服務圍繞特定業務功能構建,并能獨立部署與擴展。這種架構增強了開發靈活性、提高了系統的可維護性和擴展性,使得團隊可以更快地響應變化和市場需求。 目錄 認識微服務 單體架構 …

高效編程指南:PyCharm與DeepSeek的完美結合

DeepSeek接入Pycharm 前幾天DeepSeek的充值窗口又悄悄的開放了,這也就意味著我們又可以絲滑的使用DeepSeek的API進行各種輔助性工作了。本文我們來聊聊如何在代碼編輯器中使用DeepSeek自動生成代碼。 注:本文適用于所有的JetBrains開發工具&#xff0c…

項目中同時使用Redis(lettuce)和Redisson的報錯

溫馨提示:圖片有點小,可以放大頁面進行查看... 問題1:版本沖突 直接上圖,這個錯表示依賴版本不匹配問題,我本地SpringBoot用的是2.7,但是Redisson版本用的3.32.5。 我們通過點擊 artifactId跟進去 發現它…

Jackson 詳解

目錄 前言 Jackson 是 Java 生態中最流行的 JSON 處理庫之一,廣泛應用于 RESTful API、數據存儲和傳輸等場景。它提供了高效、靈活的 JSON 序列化和反序列化功能,支持注解、模塊化設計和多種數據格式(如 XML、YAML)。本文將詳細介…

H.264,H.265,H.266標準技術改進

關于H.264,H.265,H.266相關資料鏈接: 標準及中文資料鏈接 視頻編碼中的主要技術 視頻編碼的目標是在保證視頻質量的前提下,盡可能減少數據量。以下是視頻編碼中的核心技術: 塊劃分(Block Partitioning) 將視頻幀劃分…

clickhouse安裝路徑

《ClickHouse安裝路徑指南》 大家好,今天我們將一起學習如何在電腦上找到和理解ClickHouse的安裝路徑。這將幫助學生、科研人員以及任何對數據庫技術感興趣的人更好地管理他們的數據查詢工作。 ClickHouse是一款列式存儲數據庫管理系統(DBMS&#xff09…

時序數據庫 InfluxDB 3.0 版本性能實測報告:寫入吞吐量提升效果驗證

亮點總結: TSBS 測試表明,對于少于 100 萬臺設備的數據集,InfluxDB OSS 3.0 的數據寫入速度實際上比 InfluxDB OSS 1.8 更慢。 對于 100 萬臺及以上設備的數據集,InfluxDB OSS 3.0 的數據寫入性能才開始超過 InfluxDB OSS 1.8。…

AS32X601雙核鎖步MCU技術優勢分析

AS32X601是國科安芯公司研制的一系列基于32位RISC-V指令集車規級MCU處理器芯片。主頻高達180MHz,支持雙核鎖步架構,基于軟錯誤防護技術加持,顯著提高芯片安全性能。產品具有高安全、低失效、多IO、低成本、抗輻照等特點。 一、功能安全與可靠…

基于 LeNet 網絡的 MNIST 數據集圖像分類

1.LeNet的原始實驗數據集MNIST 名稱:MNIST手寫數字數據集 數據類型:灰度圖 (一通道) 圖像大小:28*28 類別數:10類(數字0-9) 1.通過torchvision.datasets.MNIST下載并保存到本地…

電池綜合測試儀:科技賦能,精準守護能源安全

在當今這個科技日新月異的時代,電池作為眾多電子設備的心臟,其性能的穩定與高效直接關系到設備的運行質量與使用安全。隨著電動汽車、可穿戴設備、儲能系統等領域的快速發展,對電池性能的檢測與評估提出了更高要求。在此背景下,電…

【Linux 22.4 ubuntu 安裝cuda12.1 完整方案】

下載cuda12.1 官網網址 wget https://developer.download.nvidia.com/compute/cuda/12.1.1/local_installers/cuda_12.1.1_530.30.02_linux.run sudo sh cuda_12.1.1_530.30.02_linux.run!import! 如果已經安裝驅動,則不要選擇dirver那項 添加環境變量 vim ~/.b…

實戰案例分享:Android WLAN Hal層移植(MTK+QCA6696)

本文將詳細介紹基于MTK平臺,適配高通(Qualcomm)QCA6696芯片的Android WLAN HAL層的移植過程,包括HIDL接口定義、Wi-Fi驅動移植以及wpa_supplicant適配過程,涵蓋STA與AP模式的常見問題與解決方法。 1. HIDL接口簡介 HID…

Greenplum6.19集群搭建

一,安裝說明 1.1環境說明 1、首先確定部署的環境,確定下服務器的端口,一般默認是22的端口; 2、當前這份文檔是服務器處于10022端口下部署的(現場生產環境要求,22端口在生產環境存在安全隱患)&…

電商項目-秒殺系統(四)秒殺異步下單防止重復秒殺

一、 防止惡意刷單解決 在生產場景下,可能會有一些人會惡意訪問當前網站,來進行惡意的刷單。這樣會造成當前系統出現一些業務上的業務混亂,出現臟數據,或者造成后端訪問壓力大等問題。 一般要解決這個問題的話,前端可…

原生android 打包.aar到uniapp使用

1.原生安卓里面引入uniapp官方提供的包文件: uniapp-v8-release.aar 2.提供uniapp調用的接口,新建類文件繼承UniModule, package com.dermandar.panoramal;import com.scjt.lib.certlib;import io.dcloud.feature.uniapp.annotation.UniJSM…

Android 多用戶相關

Android 多用戶相關 本文主要記錄下android 多用戶相關的adb 命令操作. 1: 獲取用戶列表 命令: adb shell pm list users 輸出如下: Users:UserInfo{0:機主:c13} running默認只有一個用戶, id為0 ,用戶狀態為運行 2: 創建新用戶 命令: adb shell …

基于Spring Boot的高校就業招聘系統的設計與實現(LW+源碼+講解)

專注于大學生項目實戰開發,講解,畢業答疑輔導,歡迎高校老師/同行前輩交流合作?。 技術范圍:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容:…

前端安全面試題匯總及參考答案

目錄 簡述 XSS 攻擊的原理及三種常見類型(存儲型、反射型、DOM 型) 如何在前端防御 XSS 攻擊?列舉編碼、過濾、CSP 策略的具體實現方式 富文本編輯器場景下如何安全處理用戶輸入的 HTML 內容? 如何通過 HttpOnly 屬性增強 Cookie 安全性?它與 XSS 防御的關系是什么? …

Linux驅動開發(1.基礎創建)

序言:從高層邏輯到底層硬件的回歸 在當今的軟件開發中,我們習慣于用高級語言構建抽象層——通過框架、庫和云服務快速實現功能。這種“軟邏輯”的便利性讓開發效率倍增,卻也逐漸模糊了我們對計算機本質的認知:一切代碼終將落地為…

Gradle本地配置文件分享

Gradle本地配置文件分享 allprojects {repositories {mavenLocal()maven { name "Alibaba" ; url "https://maven.aliyun.com/repository/public" }maven { name "Bstek" ; url "https://nexus.bsdn.org/content/groups/public/" }ma…