蓝桥杯每日一题2023.9.21

蓝桥杯2021年第十二届省赛真题-异或数列 - C语言网 (dotcpp.com)

题目描述

Alice 和 Bob 正在玩一个异或数列的游戏。初始时,Alice 和 Bob 分别有一个整数 a 和 b,有一个给定的长度为 n 的公共数列 X1, X2, · · · , Xn。

Alice 和 Bob 轮流操作,Alice 先手,每步可以在以下两种选项中选一种:

选项 1:从数列中选一个 Xi 给 Alice 的数异或上,或者说令 a 变为 a ⊕ Xi。(其中 ⊕ 表示按位异或)

选项 2:从数列中选一个 Xi 给 Bob 的数异或上,或者说令 b 变为 b ⊕ Xi。

每个数 Xi 都只能用一次,当所有 Xi 均被使用后(n 轮后)游戏结束。游戏结束时,拥有的数比较大的一方获胜,如果双方数值相同,即为平手。

现在双方都足够聪明,都采用最优策略,请问谁能获胜?

分析

分析可知a ^ b = x1 ^ x2 ^ ... ^ xn

从高位向低位看,如果a,b两数相同则异或结果为0,如果a,b两数不同则异或结果为1,最先找到是1的那一方选手获胜。

两人是任意选择异或的数,也就是谁能得到最后一个1谁就可以获胜,eg1.如果现在a的值为0,b的值为0,现在A可以拿到最后一个1,a可以变为1,而b为0,A获胜。 eg2.如果现在a的值为1,b的值为1,A拿到最后一个1,可以将b的值变为0,此时A获胜。

如果x == 1,那么先手必胜A必胜

如果x > 1, 如果y为偶数,A必胜(A先拿随意给人,每次和B对称拿,最后A一定拿最后一个1

如果y为奇数,B必胜(因为第一轮AB都拿变成偶数个0和偶数个1,此时A先拿,B总能 拿到最后一个1)

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N = 22;
int t, n, x, sum;
int main()
{
	cin >> t;
	while(t --)
	{
		cin >> n;
		sum = 0;
		int cnt[N] = {0};
		for(int i = 1; i <= n; i ++)
		{
			cin >> x;
			sum ^= x;
			for(int j = 0; j < N; j ++)
			{
				cnt[j] += x >> j & 1;//将每一位是1的数取出,此位上1的个数+1 
			}
		}
		if(!sum)cout << 0 << '\n';
		else
		{
			for(int i = N - 1; i >= 0; i --)
			{
				if(sum >> i & 1)
				{
					if(cnt[i] == 1)cout << 1 << '\n';
					else if((n - cnt[i]) % 2 == 0)cout << 1 << '\n';
					else cout << -1 << '\n';
					break;
				}
			}
		}
	}
	return 0;	
} 
相关推荐
零售ERP菜鸟3 小时前
范式革命:从“信息化”到“数字化”的本质跃迁
大数据·人工智能·职场和发展·创业创新·学习方法·业界资讯
网络安全-杰克6 小时前
2026面试自动化测试面试题【含答案】
自动化测试·软件测试·面试·职场和发展
努力学算法的蒟蒻7 小时前
day79(2.7)——leetcode面试经典150
算法·leetcode·职场和发展
CodeSheep程序羊7 小时前
拼多多春节加班工资曝光,没几个敢给这个数的。
java·c语言·开发语言·c++·python·程序人生·职场和发展
学历真的很重要8 小时前
【系统架构师】第二章 操作系统知识 - 第二部分:进程与线程(补充版)
学习·职场和发展·系统架构·系统架构师
hqyjzsb9 小时前
盲目用AI提效?当心陷入“工具奴”陷阱,效率不增反降
人工智能·学习·职场和发展·创业创新·学习方法·业界资讯·远程工作
YuTaoShao10 小时前
【LeetCode 每日一题】1653. 使字符串平衡的最少删除次数——(解法一)前后缀分解
算法·leetcode·职场和发展
VT.馒头10 小时前
【力扣】2727. 判断对象是否为空
javascript·数据结构·算法·leetcode·职场和发展
网络安全-杰克12 小时前
Jmeter压力测试工具安装与使用
自动化测试·软件测试·测试工具·jmeter·职场和发展
June bug12 小时前
【PMP】敏捷Scrum实践
经验分享·职场和发展·学习方法·scrum