bc第九场Revenge of Nim(博弈)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4994

题意:有n堆石子,每个堆有Ai个石头,,两人轮流拿石子,可以取一堆中的一颗到多颗,但是必须取完其中一堆才能开始取下一堆,最后谁拿石子,谁赢

思路:模拟几遍容易发现,谁先取得大于1的石子堆,谁就拥有了主动权,就能获得胜利,换句话说,当碰到的都是1时,那么两个人都没有选择权,根据石子堆数确定谁赢谁输,如果过程中出现大于1的堆数时,那么这个人就能通过拿ai-1个或者ai个来保证每次在大于1的堆数上都自己先拿,这样就会取得胜利

代码:

#include <cstdio>

#include <cstdlib>

#include <cstring>

#include <cmath>

#include <ctime>

#include <iostream>

#include <algorithm>

#include <string>

#include <vector>

#define debug "output for debug\n"

#define pi (acos(-1.0))

#define eps (1e-8)

#define inf 0x3f3f3f3f

#define ll long long

using namespace std;

const int maxn = 100005;

int main()

{

int t;

int n;

int a[maxn];

scanf("%d",&t);

while(t--)

{

scanf("%d",&n);

int sum=0;

int flag=0;

for(int i=0; i<n; i++)

{

scanf("%d",&a[i]);

}

for(int i=0; i<n; i++)

if(a[i]!=1)

{

flag=1;

sum=i+1;

break;

}

if(flag==0)

{

if(n%2==0)

printf("No\n");

else

printf("Yes\n");

}

else

{

if(sum%2)

printf("Yes\n");

else

printf("No\n");

}

}

return 0;

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-22 10:02:19

bc第九场Revenge of Nim(博弈)的相关文章

HDU 4994 Revenge of Nim (博弈)

题目链接:HDU 4994 Revenge of Nim 题意:两个取石头,分别在N堆里去.只有第一堆取完才能取第二堆,以此类推,最后一个取完的为赢家. 思路:从头开始扫,直到第一个不为1为止,判断现在的主动权在谁手里,谁就是赢家.(这里读者可以自己写几组数据试试.) AC代码: #include<stdio.h> #include<string.h> int main() { int yaoga; int t,i,n; int a[1010]; while(scanf("

HDU5088——Revenge of Nim II(高斯消元&amp;矩阵的秩)(BestCoder Round #16)

Revenge of Nim II Problem DescriptionNim is a mathematical game of strategy in which two players take turns removing objects from distinct heaps. On each turn, a player must remove at least one object, and may remove any number of objects provided th

2019杭电多校第九场

2019杭电多校第九场 熟悉的后半场挂机节奏,又苟进首页了,很快乐 1001. Rikka with Quicksort upsolved 不是我做的,1e9调和级数分段打表 1002. Rikka with Cake solved at 01:11 有一个矩形,给你很多射线(射线只有横平竖直的四个方向),问把矩形切成了多少块 队友说答案是交点数加一,作为一个合格的工具人,当然是把队友的想法实现啦 二维坐标离散化枚举纵坐标维护横坐标,常规套路,树状数组也可以做(我是线段树写习惯了根本没想起来还有

[NIM博弈]矿物运输

题目限制1500 ms 128 M 题目描述在某个不知名的行星上蕴含着大量冰晶矿,Jim和他的好兄弟Swan自然不能放过这个赚钱的好机会.Jim在整个星球上开掘树型矿洞,每个矿坑之间都有矿道相连.Jim和Swan在每个矿坑开采了大量的矿石,现在他们面临一个新的问题,怎么把所有的矿石运出去.已知,矿坑与矿坑之间形成了有向的树形结构,即除0号矿坑以外每个矿坑都有与其相连的父亲矿坑.Jim总共开采了  n个矿坑并将其从0到 n-1  编号 ,每个矿坑都存有   val[i]个单位的矿石.Jim和Swa

ACM学习历程—HDU 3915 Game(Nim博弈 &amp;&amp; xor高斯消元)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3915 题目大意是给了n个堆,然后去掉一些堆,使得先手变成必败局势. 首先这是个Nim博弈,必败局势是所有xor和为0. 那么自然变成了n个数里面取出一些数,使得xor和为0,求取法数. 首先由xor高斯消元得到一组向量基,但是这些向量基是无法表示0的. 所以要表示0,必须有若干0来表示,所以n-row就是消元结束后0的个数,那么2^(n-row)就是能组成0的种数. 对n==row特判一下. 代码:

UVA 11859 Division Game (Nim博弈)

题目:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=32746 题意:有一个n*m(1<=n,m<=50)矩阵,每个元素均为2~10000之间的正整数,两个游戏者轮流操作.每次可以选一行中的1个或者大于1的整数,把他们中的每个数都变成它的某个真因子,比如12可以边长1,2,3,4或者6,不能操作的输. 分析:考虑每个数包含的素因子个数(比如12=2*2*3包含3个素因子),则让一个数"变成它的素因子"

hdu 5011 (nim博弈模版)

//nim博弈 //有n堆石头,两人轮流每次从一堆中拿至少1,之多全部的石头,没有石头可拿为lose //判断先手是win还是lose # include <stdio.h> # include <algorithm> # include <string.h> using namespace std; int main() { int n,i; __int64 a,sum; while(~scanf("%d",&n)) { sum=0; fo

HDU 1849 Rabbit and Grass(nim博弈)

题目地址:HDU 1849 初次接触nim博弈,感觉好神奇的说...居然可以跟异或运算扯上关系....给人类的智商跪了...作为地球人我感到很自豪.. 具体证明什么的看这篇博客被.传送门 代码如下: #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #include <math.h> #inclu

多校第九场:贪心+矩阵快速幂中间优化+线性递推&amp;线段树递推

HDU 4968 Improving the GPA 思路:贪心的搞吧!比赛的时候想了好久,然后才发现了点规律,然后乱搞1A. 因为贪心嘛!大的情况就是刚开始每个人的分数都是最大的最小值,即绩点4.0的最低分数85,然后最后一个数设为剩余的分数,然后如果小于60就从第一个分数补到这个分数来,然后最后一个分数还小于60,那就用第二个补--依次往下搞,那时我也不知道这样就搞出答案了,我还没证明这个对不对呢,哈哈. 小的情况:小的情况就是先假设每个人都是绩点最小的最大分数,即绩点2.0的最大分数69,