[蓝桥杯]高僧斗法

article/2025/6/7 12:07:03

高僧斗法

题目描述

古时丧葬活动中经常请高僧做法事。仪式结束后,有时会有"高僧斗法"的趣味节目,以舒缓压抑的气氛。

节目大略步骤为:先用粮食(一般是稻米)在地上"画"出若干级台阶(表示 NN 级浮屠)。又有若干小和尚随机地"站"在某个台阶上。最高一级台阶必须站人,其它任意。(如下图所示)

两位参加游戏的法师分别指挥某个小和尚向上走任意多级的台阶,但会被站在高级台阶上的小和尚阻挡,不能越过。两个小和尚也不能站在同一台阶,也不能向低级台阶移动。

两法师轮流发出指令,最后所有小和尚必然会都挤在高段台阶,再也不能向上移动。轮到哪个法师指挥时无法继续移动,则游戏结束,该法师认输。

对于已知的台阶数和小和尚的分布位置,请你计算先发指令的法师该如何决策才能保证胜出。

输入描述

输入数据为一行用空格分开的 NN 个整数,表示小和尚的位置。台阶序号从 1 算起,所以最后一个小和尚的位置即是台阶的总数。(N<100,台阶总数<1000)(N<100,台阶总数<1000)

输出描述

输出为一行用空格分开的两个整数: A,BA,B,表示把 AA 位置的小和尚移动到 BB 位置。若有多个解,输出 AA 值较小的解,若无解则输出 -1。

输入输出样例

示例

输入

1 5 9

输出

1 4

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

总通过次数: 277  |  总提交次数: 407  |  通过率: 68.1%

难度: 中等   标签: 2013, 国赛, 博弈

核心思路:Nim博弈模型转换
  1. ​问题转换​​:

    • 将小和尚按位置升序排序(如输入 1 5 9 排序后为 [1, 5, 9])。
    • ​两两分组​​:从低到高每两个小和尚为一组(位置索引0和1一组、2和3一组...),若小和尚数量为奇数,则忽略最后一个(最高台阶的和尚不可移动)
    • ​计算间隔​​:每组两个和尚之间的台阶数为 b[i] = a[2i+1] - a[2i] - 1(例如 1 和 5 的间隔为 5-1-1=3)。
  2. ​Nim博弈规则​​:

    • 所有组的间隔值构成一个Nim堆,计算异或值 XOR = b[0] ^ b[1] ^ ... ^ b[m-1]
    • ​先手必胜条件​​:XOR ≠ 0;若 XOR = 0 则先手必败,输出 -1
  3. ​寻找必胜策略​​:

    • 遍历每组,计算目标间隔 target = XOR ^ b[i]
    • 若 target < b[i],可通过移动该组第一个和尚减少间隔:
      • 移动步数 step = b[i] - target
      • 新位置 B = a[2i] + step
    • ​输出要求​​:取 A(移动前位置)最小的解,因此按分组顺序遍历,找到首个可行解即输出
#include <iostream>
#include <vector>
#include <algorithm>
#include <sstream>
#include <string>
using namespace std;int main() {string line;getline(cin, line);stringstream ss(line);vector<int> positions;int pos;// 读取并排序小和尚位置while (ss >> pos) {positions.push_back(pos);}sort(positions.begin(), positions.end());int n = positions.size();// 计算分组间隔(两两分组)vector<int> gaps;for (int i = 0; i < n - 1; i += 2) {gaps.push_back(positions[i + 1] - positions[i] - 1);}// 计算初始 Nim 异或值int nimXOR = 0;for (int gap : gaps) {nimXOR ^= gap;}// 先手必败情况if (nimXOR == 0) {cout << -1 << endl;return 0;}// 寻找必胜策略(优先移动位置最小的和尚)for (int i = 0; i < n - 1; i++) {int maxStep = positions[i + 1] - positions[i] - 1;for (int step = 1; step <= maxStep; step++) {if (i % 2 == 0) {  // 移动分组的前一个和尚int groupIdx = i / 2;int newGap = gaps[groupIdx] - step;if (newGap < 0) continue;if ((nimXOR ^ gaps[groupIdx] ^ newGap) == 0) {cout << positions[i] << " " << positions[i] + step << endl;return 0;}} else {  // 移动分组的后一个和尚int groupIdx = (i - 1) / 2;int newGap = gaps[groupIdx] + step;if ((nimXOR ^ gaps[groupIdx] ^ newGap) == 0) {cout << positions[i] << " " << positions[i] + step << endl;return 0;}}}}// 理论不应执行到此(Nim 模型保证有解)cout << -1 << endl;return 0;
}

核心算法解析

  1. ​问题转换​

    • 将小和尚位置升序排序(如输入 1 5 9 → 排序 [1,5,9]
    • ​两两分组​​:(1,5) 为一组(忽略最后单个和尚)
    • ​计算间隔​​:每组台阶差减 1(5-1-1=3
  2. ​Nim 博弈模型​

    • 计算所有间隔的异或值:XOR = 3 ^ (下一组间隔)...
    • ​必胜条件​​:XOR ≠ 0(先手可赢);XOR=0 则输出 -1
  3. ​寻找最优移动​

    • ​缩短间隔​​:移动每组前一个和尚(如 1→4 使间隔 3→0
    • ​增加间隔​​:移动后一个和尚(如 5→6 影响前组间隔)
    • ​优先级​​:优先尝试 A 值更小的移动(外层循环从低到高遍历分组)

关键优化与边界处理

  1. ​位置重复校验​
    输入时隐式处理了位置重复(sort 后相邻位置差为 0 时,maxStep 为负,循环跳过)。

  2. ​移动策略全覆盖​​:

    • ​前和尚移动​​:减少当前组间隔(gaps[groupIdx] - step
    • ​后和尚移动​​:增加前组间隔(gaps[groupIdx] + step
    • 按位置升序遍历,确保输出 A 值最小的解
  3. ​极端输入处理​​:

    • ​单和尚情况​​:n=1 时分组间隔为空,nimXOR=0 直接输出 -1
    • ​最大台阶​​:positions[i+1]-positions[i]-1 自动处理边界
    • ​密集位置​​:如 [1,2,3,4] 所有 maxStep=0,跳过移动
  4. ​性能保障​​:

    • 时间复杂度:O(n⋅maxStep),最坏 100×1000=105 次操作
    • 空间复杂度:O(n),仅存储位置和间隔

测试用例验证

输入输出说明
1 5 91 4标准案例(移动前和尚)
1 5 8 101 3移动前和尚(A 最小解)
1 3 5-1先手必败(异或值=0)
1 2 4 72 3移动后和尚(间隔增加)
1 10001 2极端大间隔(仍保证有解)

http://www.hkcw.cn/article/xGWQtssRrt.shtml

相关文章

C++语法系列之类型转换

前言 类型转换是经常存在的情况&#xff0c;类型转换分为隐式类型转化 和 显式类型转化 隐式类型转化&#xff1a;编译器在编译阶段自动进行&#xff0c;能转就转&#xff0c;不能转就编译失败 double i 3.3; int b i; //隐式类型转化 double -> intC搞出来了四种强制类…

Python----循环神经网络(BiLSTM:双向长短时记忆网络)

一、LSTM 与 BiLSTM对比 1.1、LSTM LSTM&#xff08;长短期记忆网络&#xff09; 是一种改进的循环神经网络&#xff08;RNN&#xff09;&#xff0c;专门解决传统RNN难以学习长期依赖的问题。它通过遗忘门、输入门和输出门来控制信息的流动&#xff0c;保留重要信息并丢弃无关…

工作自动化——工作自动提炼--智能编程——仙盟创梦IDE

工作自动化中的自动提炼、自动比对代码生成日志&#xff0c;为软件开发与项目管理带来诸多好处。 自动提炼能从复杂代码中精准提取关键信息&#xff0c;节省人工梳理时间&#xff0c;开发人员可快速把握核心逻辑&#xff0c;加速项目熟悉进程。自动比对代码则及时发现版本间差异…

运行shell脚本时报错/bin/bash^M: 解释器错误: 没有那个文件或目录

Windows的换行符为\r\n&#xff0c;而linux换行符为\n。先查看一下文件是什么格式的 :set ff --查询一下格式是什么 由于使用nodepad新建的脚本&#xff0c;首选项中格式设置成了windows&#xff0c;上传到linux中报错。 解决方法 1、nodepad中【设置》首选项】修改为unix&am…

6. 基础IO

0.背景 a.访问一个文件&#xff0c;都必须先把对应的文件打开&#xff08;打开文件就是把它从磁盘加载到内存中&#xff09; b.如果一个文件&#xff0c;压根就没有被打开&#xff0c;那么它就在磁盘上 c.谁来打开&#xff1f;&#xff1f;用户通过bash&#xff0c;启动进程…

碰一碰发视频-源码系统开发技术分享

#碰一碰营销系统# #碰一碰系统# #碰一碰发视频# 架构设计哲学&#xff1a;近场通信的优雅平衡 一、核心通信技术选型 1. 双模协同传输引擎 技术协议栈延迟控制适用场景NFCISO 14443-A<100ms精准触发场景BLE 5.0GATT Profile300-500ms中距传输场景 工程决策依据&…

动态规划之网格图模型(二)

文章目录 动态规划之网格图模型&#xff08;二&#xff09;LeetCode 931. 下降路径最小和思路Golang 代码 LeetCode 2684. 矩阵中移动的最大次数思路Golang 代码 LeetCode 2304. 网格中的最小路径代价思路Golang 代码 LeetCode 1289. 下降路径最小和 II思路Golang 代码 LeetCod…

QUIC——UDP实现可靠性传输

首先我们要知道TCP存在什么样的痛点问题 TCP的升级很困难TCP建立连接的延迟网络迁移需要重新建立连接TCP存在队头阻塞问题 QUIC就是为了解决以上的问题而诞生了, 下面我会介绍QUIC的一些特性和原理 QUIC对比TCP优势: 握手建连更快 QUIC内部包含了TLS, 它在自己的帧会携带TL…

PyTorch——线性层及其他层介绍(6)

线性层 前面1,1,1是你想要的&#xff0c;后面我们不知道这个值是多少&#xff0c;取-1让Python自己计算 import torch import torchvision from torch import nn from torch.nn import Linear from torch.utils.data import DataLoader# 加载CIFAR-10测试数据集并转换为Tensor格…

bilibili批量取消关注

目录 如何使用 ​编辑 代码 如何使用 使用谷歌浏览器&#xff0c;通过F12打开调式面板&#xff0c;找到下面的位置&#xff1a; 代码 /*** 批量取消关注脚本* 自动遍历多页内容并取消所有关注*/// 配置常量 const CONFIG {CLICK_DELAY: 250, // 点击间隔时间&#…

7.RV1126-OPENCV cvtColor 和 putText

一.cvtColor 1.作用 cvtColor 是 OPENCV 里面颜色转换的转换函数。能够实现 RGB 图像转换成灰度图、灰度图转换成 RGB 图像、RGB 转换成 HSV 等等 2.API CV_EXPORTS_W void cvtColor( InputArray src, OutputArray dst, int code, int dstCn 0 ); 第一个参数&#xff1a;…

研发型企业如何面对源代码保密问题

在当今数字化时代&#xff0c;研发团队面临着数据安全和工作效率的双重挑战。技术成果和源代码不仅是企业的核心资产&#xff0c;更是企业竞争力的基石。然而&#xff0c;数据泄露的风险无处不在&#xff0c;从内部员工的无意失误到外部攻击者的恶意窃取&#xff0c;都可能给企…

BeeWorks:私有化即时通讯,筑牢企业信息安全防线

在数字化时代&#xff0c;即时通讯已成为企业日常运营中不可或缺的工具。然而&#xff0c;数据安全问题一直是企业使用即时通讯服务时的重要考量因素。BeeWorks即时通讯系统以其私有化部署模式&#xff0c;为企业提供了一个安全、可靠、自主可控的沟通平台。 私有化部署&#…

akka实践之应用的扩展性问题和actor模型

如何解决应用的扩展性问题 当一个应用需要处理海量并发请求时&#xff0c;传统的开发模式往往显得力不从心&#xff0c;为什么应用需要扩展性&#xff1f; 需求增长: 用户量激增&#xff0c;数据量爆炸式增长。资源限制: 服务器、带宽、存储等资源有限。复杂性增加: 代码逻辑…

Starrocks Full GC日志分析

GC日志样例&#xff1a; [2025-06-03T07:36:06.1770800] GC(227) Pause Full (G1 Evacuation Pause) [2025-06-03T07:36:06.1960800] GC(227) Phase 1: Mark live objects [2025-06-03T07:36:06.9480800] GC(227) Cleaned string and symbol table, strings: 47009 processed,…

mapbox高阶,生成并加载等时图

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️Fill面图层样式1.4 ☘️symbol符号图层…

防火墙在OSI模型中的层级工作(2025)

1. 物理层&#xff08;L1&#xff09;& 数据链路层&#xff08;L2&#xff09; 传统防火墙&#xff1a;通常不处理L1/L2&#xff08;由交换机/网卡负责&#xff09;。 现代演进&#xff1a; MAC地址过滤&#xff1a;部分防火墙支持基于MAC地址的粗粒度策略&#xff08;如禁…

帝可得 - 运营管理APP

Android模拟器 本项目的App客户端部分已经由前端团队进行开发完成&#xff0c;并且以apk的方式提供出来&#xff0c;供我们测试使用&#xff0c;如果要运行apk&#xff0c;需要先安装安卓的模拟器。 可以选择国内的安卓模拟器产品&#xff0c;比如&#xff1a;网易mumu、雷电…

关于list集合排序的常见方法

目录 1、list.sort() 2、Collections.sort() 3、Stream.sorted() 4、进阶排序技巧 4.1 空值安全处理 4.2 多字段组合排序 4.3. 逆序 5、性能优化建议 5.1 并行流加速 5.2 原地排序 6、最佳实践 7、注意事项 前言 Java中对于集合的排序操作&#xff0c;分别为list.s…

自然语言处理(NLP)的系统学习路径规划

文章目录 一、基础准备阶段&#xff08;1-2个月&#xff09;1. 数学基础2. 编程基础3. 语言学基础 二、核心技术阶段&#xff08;3-4个月&#xff09;1. 经典NLP技术2. 深度学习模型3. 预训练模型入门 三、进阶实战阶段&#xff08;2-3个月&#xff09;1. 热门任务实战2. 大模型…