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

小志志和小峰峰的日常

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

3
1
3
2 2
2
4 7
4 5
3
3 4 7
8 8

Sample Output

xff
xzz
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 先手必胜。
否则先手必败。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e5+5;
string s[2];
ll n, x, y, T;
ll arr[N];

bool f1(ll ans){
    for(int i = 1; i <= n; i++)
    ans ^= arr[i]%(x+1);
    return ans != 0;
}

int main()
{
    s[1] = "xzz", s[0] = "xff";
    cin >> T;
    while(T--)
    {
        cin >> n;
        for(int i = 1; i <= n; i++) cin >> arr[i];
        cin >> x >> y;
        if(x == y) cout << s[f1(0)] << endl; //经典sg
        else{
            int flag = 0, ans = 0;
            for(int i = 1; i <= n; i++){
                ans ^= arr[i];
                if(arr[i] > min(x, y))
                    flag++;
            }
            if(!flag){  // Nim博弈
                if(ans) cout << s[1] << endl;
                else cout << s[0] << endl;
            }
            else{
                if(x > y) cout << s[1] << endl;
                else{
                    if(flag > 1) cout << s[0] << endl;
                    else{
                        int t;
                        for(int i = 1; i <= n; i++){
                            if(arr[i] > min(x, y)){
                                t = arr[i];
                                ans ^= arr[i];
                                break;
                            }
                        }
                        if(t - ans <= x && ans <= x)
                            cout << s[1] << endl;
                        else cout << s[0] << endl;
                    }
                }
            }
        }
    }
    return 0;
}


原文地址:https://www.cnblogs.com/philo-zhou/p/11391233.html

时间: 2024-10-12 17:13:48

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

Sdut 2108 Alice and Bob(数学题)(山东省ACM第四届省赛D题)

题目地址:sdut 2608 Alice and Bob Alice and Bob Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 Alice and Bob like playing games very much.Today, they introduce a new game. There is a polynomial like this: (a0*x^(2^0)+1) * (a1 * x^(2^1)+1)*....

轻院 2177 小姐姐的忠告:少吃辣条多刷题

题目链接:https://acm.zzuli.edu.cn/zzuliacm/problem.php?id=2177 题目大意:n个球放入n个箱子中,每个箱子放一个.每个球都是独一无二的,问方案数能被最大2的几次方整除. 解题思路:很明显方案数目就是n!,而所求的实际上是2~n中每个数的中有几个2.显然奇数可忽略,对于1~n的所有偶数来说,一次除二之后所有数都缩小了一半,即相当于求1~n/2的所有偶数,反复如此,可以很快得到思路. 代码: 1 const int inf = 0x3f3f3f3f

SDUT 2766 小明传奇2

小明传奇2 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 小明不但创建了自己的商店而且选择了建立了自己的货币系统. 传统地,一个货币系统是由1,5,10,20 或 25,50, 和 100的单位面值组成的. 小明想知道有多少种不同的方法来用货币系统中的货币来构造一个确定的数值. 举例来说, 使用一个货币系统 {1,2,5,10,...}产生 18单位面值的一些可能的方法是:18x1, 9x2, 8x2+2x1, 3x5+2+

小志打造-你就是我的王妃(夜

 http://imgur.com/Wx7oBL0 http://imgur.com/L5uiDsO http://imgur.com/K0z2zM9 http://imgur.com/QEWFV6t http://imgur.com/DlCA1Gw http://imgur.com/xgxPSeo http://imgur.com/JyY36vJ http://imgur.com/Vem1gkw http://imgur.com/4dsH7k9 http://imgur.com/Lif3q

】●小模特伊娃的日常

ID:Eva伊娃妹 年龄:21 地区:广东 职业:平面模特 爱好:唱歌.美妆.看杂志 简介:除了专职平面模特,也是微博的美妆博主哦~平时都喜欢...http://weibo.com/2015/p/1001603884882194513407http://weibo.com/2015/p/1001603884882198707815http://weibo.com/2015/p/1001603884882202902231http://weibo.com/2015/p/10016038848822

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

小Q系列故事——世界上最遥远的距离 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 1751    Accepted Submission(s): 628 Problem Description 世界上最遥远的距离 不是生与死 而是我就站在你面前 你却不知道我爱你 世界上最遥远的距离 不是我就站在你面前你却不知道我爱你 而是明明知道彼此相爱

hihocoder #1062 : 最近公共祖先&#183;一(小数据量 map+set模拟+标记检查 *【模板】思路 )

#1062 : 最近公共祖先·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho最近发现了一个神奇的网站!虽然还不够像58同城那样神奇,但这个网站仍然让小Ho乐在其中,但这是为什么呢? “为什么呢?”小Hi如是问道,在他的观察中小Ho已经沉迷这个网站一周之久了,甚至连他心爱的树玩具都弃置一边. “嘿嘿,小Hi,你快过来看!”小Ho招呼道. “你看,在这个对话框里输入我的名字,在另一个对话框里,输入你的名字,再点这个查询按钮,就可以查出来……什么!我们居然有同

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

2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 9894  Solved: 4561[Submit][Status][Discuss] Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两

酷客多小程序重磅升级,这十几个模板足以打动你的心!

酷客多小程序(www.kukeduo.cn)DIY系统2.0上线!商家期待已久的DIY升级版终于上线了!升级版功能更强大,编辑能力更强.说到这有没有让你很心动,那少废话,上图! 右侧12个模板有没有您喜欢的? 可以完全新建空白模板,也可以在模板库选择模板并可对所有模块进行编辑或者删除,除此之外布局.背景色,列表样式,按钮样式均可自由设置,是不是很强大? 下面介绍一下每一个模板适用的行业和功能 汽车4S店模板 4S中心模板主要适用于4S店.汽车美容保养等行业. 主要功能有服务项目预约(保养,维修等