原题链接:取火柴游戏 - 洛谷

题目描述

输入 k及 k个整数 n1​,n2​,…,nk​,表示有 k 堆火柴棒,第 ii堆火柴棒的根数为ni​;接着便是你和计算机取火柴棒的对弈游戏。取的规则如下:每次可以从一堆中取走若干根火柴,也可以一堆全部取走,但不允许跨堆取,也不允许不取。

谁取走最后一根火柴为胜利者。

输入格式

第一行,一个正整数 k。

第二行,k个整数 n1​,n2​,…,nk​。

输出格式

如果是先取必胜,请在第一行输出两个整数 a,b,表示第一次从第 b 堆取出 a个。第二行为第一次取火柴后的状态。如果有多种答案,则输出 <b,a>字典序最小的答案 ( 即 b 最小的前提下 a最小 )。

如果是先取必败,则输出“lose”。

Nim游戏

(转载)Nim游戏博弈(收集完全版) - exponent - 博客园

博弈论 套路开始的地方(NIM游戏和Sprague-Grundy函数)_隐形的稻草人哦的博客-CSDN博客

在普通Nim游戏中,a1^a2^a3^……^an=0是必败态

如果一开始 a1^a2^a3^……^an=0,那么先手必败;如果一开始不为0,那么一定可以让一堆石子中的数减小使得下一轮a1^a2^a3^……^an=0

而只要从前往后找到(x ^ a[i]) < a[i]),那么新的a[i]值就是x ^ a[i],可以让异或结果变为0

AC代码:

#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
typedef long long ll;
typedef pair<int, int> PII;
const double pi = acos(-1.0);
#define rep(i, n) for (int i = 1; i <= (n); ++i)
#define rrep(i, n)const int N = 5e5 + 10;
int a[N];int main()
{int n;cin >> n;int x = 0;rep(i, n) cin >> a[i], x ^= a[i];if(x == 0){cout << "lose";}else{rep(i, n){if((x ^ a[i]) < a[i]){cout << a[i] - (x ^ a[i]) << " " << i << endl;a[i] = a[i] ^ x;break;}}rep(i, n) cout << a[i] << " ";}return 0;
}

P1247 取火柴游戏 (博弈论)相关推荐

  1. P1247 取火柴游戏

    P1247 取火柴游戏 题意: 有n堆火柴,两个人轮流操作,每次只能在从一堆中取若干火柴,拿走最后一根火柴的为胜者,给你一个状态,问先手是赢是输 题解: 很经典的nim博弈,结论大家应该都知道就是全部 ...

  2. P1247ybtoj【数学基础】5章1题【取火柴游戏】

    取火柴游戏 题目 P1247 解析 显然,这是一个NIM博弈的板子 NIM博弈的定义是:有 n n n堆石子,第 i i i堆有 a i a_i ai​个石子,两个玩家轮流取出任意一堆的任意个石子(不 ...

  3. 【游戏中的算法】取火柴游戏算法

    文章目录 一.取火柴游戏算法: 二.C/C++实现代码: 1.模拟两个人随机取火柴: 2.电脑随机取火柴,用户输入取火柴: 一.取火柴游戏算法: 取火柴游戏是一个非常简单有趣的小游戏,只要计算好步骤就 ...

  4. 人机对战之取火柴游戏

    源码 #include<iostream.h> void main() {int a=21, i;cout<<"--------------------------- ...

  5. 【YBTOJ】【Luogu】取火柴游戏

    思路: 经典NIM游戏 c o d e code code #include<iostream> #include<cstdio>using namespace std;int ...

  6. POJ1067 取石子游戏 跪跪跪,很好的博弈论

    取石子游戏 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 29951   Accepted: 9814 Descriptio ...

  7. 取火柴小游戏python turtle库

    目录 一.代码展示 二.代码讲解 1.海龟画布初始化和检测用户输入 2.绘制火柴的函数draw_line() 3.主程序 4.奖励环节. 游戏介绍 这是一场电脑和人类的博弈.游戏规则是:一共有21个火 ...

  8. 【POJ】1067 取石子游戏(博弈论)

    Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后 ...

  9. 博弈论——1218:取石子游戏

    1218:取石子游戏时间限制: 1000 ms 内存限制: 65536 KB 提交数: 10430 通过数: 4939 [题目描述] 有两堆石子,两个人轮流去取.每次取的时候,只能从较多的那堆石子里取 ...

最新文章

  1. CloudStack部署篇二 高级网络设置
  2. numpy 修改数据类型
  3. 服务器流量异常排查步骤(查看进程的流量)
  4. Centos7 防火墙和Selinux 一些简单操作命令
  5. P1091 合唱队形[单调性+DP]
  6. 动态规划 - 买卖股票的最佳时机 IV
  7. 中等职业计算机等级考试,中等职业学校计算机等级考试题库(含答案):EXCEL
  8. SFB 项目经验-52-Outlook-2010/2013-连接Exchange 2016需要密码!
  9. php 图像编程库,php – 数据图像库64
  10. wifi频率和zigbee干扰_怎样设置Zigbee和wifi信道避免干扰?
  11. Matlab多项式基本运算(1)( polyval和polyvalm的区别)
  12. 计算机中带符号的整数表示方法,带符号数的代码表示-数字电子技术-电子发烧友网站...
  13. php仿止伪装ip,php伪造ip与防止伪造ip方法解析
  14. vs code c语言安装视频,vscode怎样安装c语言环境
  15. 商品服务 - 销售属性维护,属性分组与属性关联
  16. 如何更改 Win7 网络连接显示名称
  17. python语言表示语句结构_python基础语言以及if/while语句结构
  18. 排序算法之归并排序及Java实现
  19. 第一行代码-android-第三版-pdf扫描-思维导图-课件-源码
  20. 基于Python使用ffmpeg批量缩放图片

热门文章

  1. Python3 print pprint
  2. MySQL从删库到跑路(9):group by——给漂亮小姐姐分个组
  3. 凸优化学习(二)——凸集
  4. python列表可以放不同类型_python基础篇数据类型之二——列表(List)
  5. (二十)通俗易懂理解——汽车功能安全
  6. tsp问题的c语言编码,原创:TSP有关问题解决方案-禁忌搜索算法C实现
  7. For循环的简单实例
  8. 微电子新手入门之Cadence常用操作——Cadence layout打散版图
  9. allegro中design size无法修改
  10. DHCP租约过程,如何使用DHCP