小志志和小峰峰的日常

Time Limit: 1000 ms Memory Limit: 65536 KiB

Problem Description

小志志和小峰峰特别喜欢一起讨论一些很好玩的问题。 
小志志发现一个有趣的游戏,马上和小峰峰进行了分享。 
有 n 堆石子堆,每堆石子个数为 a[i]。 
到小志志的回合:小志志可以选取其中的一堆,拿至少 1 个最多 x 个石子。 
到小峰峰的回合:小峰峰可以选取其中的一堆,拿至少 1 个最多 y 个石子。 
小志志先手,回合交替进行,到该玩家回合如果无法操作,该玩家输。

Input

输入一个 T,总共有 T 组测试数据。 
每组测试数据: 
第一行输入 n 代表有 n 堆石子堆。 
第二行输入 n 堆石子堆分别的数量。 
第三行输入两个用空格隔开的 x, y 分别代表小志志和小峰峰对于一堆石子最多能拿的数量。 
(1 <= n <= 1e5, 1 <= a[i], x, y <= 1e9)

Output

小志志赢输出 “xzz”,小峰峰赢输出 “xff”,答案不包含 “”。

Sample Input

  1. 3
  2. 1
  3. 3
  4. 2 2
  5. 2
  6. 4 7
  7. 4 5
  8. 3
  9. 3 4 7
  10. 8 8

Sample Output

  1. xff
  2. xzz
  3. xff


题解:

我们需要分类讨论:
x == y 的时候:经典的 sg
x != y 的时候:
任意的 a[i] <= min(x, y):Nim 博弈
否则至少存在一堆 a[i] > min(x, y):
如果 x > y:
我们把先手能拿的石子个数看成 y 的话,就是经典的 sg,如果亦或和不是 0 那么先手必
胜。
如果亦或和是 0,那么先手可以选择石子个数大于 y 的堆,拿掉 y+1 的石子个数。这样对
于对方而言亦或和还是 0。所以先手必胜。
所以无论如何:先手必胜
如果 x < y:
如果石子堆个数 > min(x, y) 的堆数大于 2:后手必胜,先手无论如何处理都会变成上述的
情况。
如果石子堆个数 > min(x, y) 的堆数 == 1:
先手肯定会选择 > min(x, y) 的石子堆进行操作,不然先手必败。
设这堆石子个数为 t,除去这堆石子的亦或和为 ans,你只有将这堆石子个数变成 ans &&
ans <= x 才能赢。
所以 t-x <= ans && ans <= x 先手必胜。
否则先手必败。

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4. const int N = 1e5+5;
  5. string s[2];
  6. ll n, x, y, T;
  7. ll arr[N];
  8.  
  9. bool f1(ll ans){
  10. for(int i = 1; i <= n; i++)
  11. ans ^= arr[i]%(x+1);
  12. return ans != 0;
  13. }
  14.  
  15. int main()
  16. {
  17. s[1] = "xzz", s[0] = "xff";
  18. cin >> T;
  19. while(T--)
  20. {
  21. cin >> n;
  22. for(int i = 1; i <= n; i++) cin >> arr[i];
  23. cin >> x >> y;
  24. if(x == y) cout << s[f1(0)] << endl; //经典sg
  25. else{
  26. int flag = 0, ans = 0;
  27. for(int i = 1; i <= n; i++){
  28. ans ^= arr[i];
  29. if(arr[i] > min(x, y))
  30. flag++;
  31. }
  32. if(!flag){ // Nim博弈
  33. if(ans) cout << s[1] << endl;
  34. else cout << s[0] << endl;
  35. }
  36. else{
  37. if(x > y) cout << s[1] << endl;
  38. else{
  39. if(flag > 1) cout << s[0] << endl;
  40. else{
  41. int t;
  42. for(int i = 1; i <= n; i++){
  43. if(arr[i] > min(x, y)){
  44. t = arr[i];
  45. ans ^= arr[i];
  46. break;
  47. }
  48. }
  49. if(t - ans <= x && ans <= x)
  50. cout << s[1] << endl;
  51. else cout << s[0] << endl;
  52. }
  53. }
  54. }
  55. }
  56. }
  57. return 0;
  58. }


sdut——4541:小志志和小峰峰的日常(取石子博弈模板题 4合1)的更多相关文章

  1. BZOJ1022[SHOI2008]小约翰的游戏——anti-SG(反尼姆博弈)

    题目描述 小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有n堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子,在这堆石子中取走任意多的石子,但不能一粒石子也不取,我们规定取到 ...

  2. 清橙A1206.小Z的袜子 && CF 86D(莫队两题)

    清橙A1206.小Z的袜子 && CF 86D(莫队两题) 在网上看了一些别人写的关于莫队算法的介绍,我认为,莫队与其说是一种算法,不如说是一种思想,他通过先分块再排序来优化离线查询问 ...

  3. SDUT 2766 小明传奇2

    小明传奇2 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 小明不但创建了自己的商店而且选择了建立了自己的货币系统. 传统地,一个 ...

  4. 「拉勾网」薪资调查的小爬虫,并将抓取结果保存到excel中

    学习Python也有一段时间了,各种理论知识大体上也算略知一二了,今天就进入实战演练:通过Python来编写一个拉勾网薪资调查的小爬虫. 第一步:分析网站的请求过程 我们在查看拉勾网上的招聘信息的时候 ...

  5. hdu---(4515)小Q系列故事——世界上最遥远的距离(模拟题)

    小Q系列故事——世界上最遥远的距离 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)T ...

  6. BZOJ 2038: [2009国家集训队]小Z的袜子(hose)【莫队算法裸题&&学习笔记】

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 9894  Solved: 4561[Subm ...

  7. 一套代码小程序&Web&Native运行的探索03——处理模板及属性

    接上文:一套代码小程序&Web&Native运行的探索02 对应Git代码地址请见:https://github.com/yexiaochai/wxdemo/tree/master/m ...

  8. 微信小程序--data的赋值与取值

    通过小程序官方文档可知:Page() 函数用来注册一个页面.接受一个 object 参数,其指定页面的初始数据.生命周期函数.事件处理函数等.其中的参数data用来设置初始数据,WXML 中的动态数据 ...

  9. HDU 2072 - 单词数 - [(有点小坑的)字典树模板题]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2072 Problem Descriptionlily的好朋友xiaoou333最近很空,他想了一件没有 ...

  10. Luogu 1494 - 小Z的袜子 - [莫队算法模板题][分块]

    题目链接:https://www.luogu.org/problemnew/show/P1494 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天 ...

随机推荐

  1. js 比较两个数组对象,取不同的值

    let array1 = [ {'Num': 'A ', 'Name': 't1 '}, {'Num': 'B', 'Name': 't2'}, {'Num': 'C ', 'Name': 't3 ' ...

  2. How to find WWN and WWPN of HBA card in Linux

    There are several ways to detect the WWN of a Fibre Channel (FC) HBA and their details in Linux/Unix ...

  3. c++ 在项目中创建DLL,并调用

    创建DLL分为两种方法,先介绍第一种 一.创建DLL (1) // dll.h #pragma once //dll.h #ifndef DLL_H_ #define DLL_H_ void prin ...

  4. vue创建项目的命令

    一.首先下载node环境 二.全局安装vue-cli cnpm i -g @vue/cli 这里一定要注意是vue/cli,而不是vue-cli 三.新建文件夹,打开cmd命令 1.vue creat ...

  5. python 函数默认值误区

    当创建python函数时,默认值参数实在执行def语句的时候创建的也即是在创建该函数的时候,而不是在调用该函数的时候创建的. def append(x, lst = []): lst.append(x ...

  6. 2月21日python程序设计

    Python变量 1.不需要事先声明变量名及其类型,直接赋值即可. 2.强类型编程语言,根据赋值或运算来推断变量类型. 3.动态类型语言,变量的类型也是可以随时变化的. >>>  x ...

  7. SQL五十题记录 1-2

    前言: 创建以下四张表:①:课程表 ②:成绩表 ③:学生表 ④:教师表 1.查询课程编号为""01""的课程比"02"的课程成绩高的所有学生 ...

  8. springboot项目记录2用户注册功能

    七.注册-业务层 7.1规划异常 7.1.1用户在进行注册的时候,可能会产生用户名被占用的错误,抛出一个异常: RuntimeException异常,作为该异常的子类,然后再去定义具体的异常类型继承这 ...

  9. swoft-个基于 Swoole 原生协程的PHP 微服务框架

    刚才百度了一下swoft框架,官网打不开了,仓库也暂停了.不由感慨.曾经和同事踩了许多坑使用此极其小众的框架完成微服务项目.使用它的唯一目的就是提高程序性能(底层使用了协程),为此大家都学习了很多新知 ...

  10. QT数据结构内存分配策略

    在QT的Reference中无意看到了QString及其他类型数据结构内存的分配策略,翻译并记录一下. 在QString的数据结构中,QString通过一次附加一个字符来动态构建字符串.假设我们向QS ...