博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
石子博弈
阅读量:6252 次
发布时间:2019-06-22

本文共 1086 字,大约阅读时间需要 3 分钟。

链接:

来源:牛客网

题目描述

有n堆石子,第i堆石子有x
i个。
修修和栋栋轮流取石子,每人每次需要从任意一堆石子中取走
个,修修先手。无法操作的人失败。此外,如果一个人取完了一堆石子,他会立即获胜。
不巧的是,修修除了数数以外啥都不会,他希望你帮他求出他能否获胜。

输入描述:

第一行一个整数t表示数据组数 (1 ≤ t ≤ 1000)。 每组数据第一行三个整数n,a,b (1 ≤ n ≤ 1000,1≤ a ≤ b ≤ 10
9
),第二行n个整数
(1 ≤ x
i
≤ 10
9
)。

输出描述:

每组数据输出一行一个字符串:如果修修可以获胜输出Yes,否则输出No。
示例1

输入

21 1 341 1 36

输出

NoYes 题意 : 有 n 堆石子,石子个数是给定的,每次可以取出的石子个数是 a - b, 当一次完全取完某一堆时即代表获胜。 思路分析 :   基本就是3种情况,   1 . 当石子个数 < a 时,此时 sg 值为 0   2 . 当石子个数 >= a && <= b 时,此时直接取胜   3 . 当石子个数 > b 时,打表计算此时的 sg 值,找规律,但是要注意的是此时的后继状态是不能到达 a-b 的,因为到达就必输 代码示例 :
#include 
using namespace std;#define ll long longll n, a, b;ll SG(ll x){ if (x <= b) return 0; if (a == 1) return x%(1+b); x -= b; x %= (a+b); x = x/a; if (x <= 1) x ^= 1; return x;}int main () { ll t; ll x; cin >> t; while(t--){ scanf("%lld%lld%lld", &n, &a, &b); ll ans = 0; ll sign = 0; for(ll i = 1; i <= n; i++){ scanf("%lld", &x); if (x >= a && x <= b) sign = 1; ans ^= SG(x); } if (ans || sign) puts("Yes"); else puts("No"); } return 0;}

 

转载于:https://www.cnblogs.com/ccut-ry/p/9744999.html

你可能感兴趣的文章
Project Euler 26 Reciprocal cycles( 分数循环节 )
查看>>
做了几道简单的基础题,慢慢熟悉循环
查看>>
元素的多种延时等待(&页面的超时处理)
查看>>
ios 后台发送邮件之SKPSMTPMessage的使用
查看>>
JavaScript学习
查看>>
3014C语言_运算符
查看>>
202702算法_二分法查找
查看>>
Win10 UWP开发实现Bing翻译
查看>>
各种不同类型的类
查看>>
mvc4 -@Html.Partial,@Html.RenderPartial
查看>>
windows2012 r2 提高网速方法
查看>>
调试R代码中出现的常用的函数
查看>>
JavaWeb 之 AJAX
查看>>
十、spark graphx的scala示例
查看>>
探秘SpringAop(一)_介绍以及使用详解
查看>>
查询指定时间内审核失败的事件日志
查看>>
problem-solving-with-algorithms-and-data-structure-usingpython(使用python解决算法和数据结构) -- 算法分析...
查看>>
springmvc流程
查看>>
BAT涉足汽车产业后对汽车后市场的影响是什么?
查看>>
LeetCode:Remove Nth Node From End of List
查看>>