第十二届蓝桥杯 异或数列

原题:

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.mzph.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…