题目传送门

暴力

\((\)由于我这样的初中蒟蒻不\((bu)\)喜\((hui)\)欢\((xie)\)数学证明,所以题解中的证明全是其他大佬的题解已经多次证明过的,这里就不再啰嗦了。\()\)

------逗比与正经的分界线→_→------

思路:

就是先判断是否先手必胜,如果不是,就直接输出\(lose\),如果是的话,一根一根的取,就能得到正解啦!注释详见代码。

优化前的90分TlE代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define N 500001
using namespace std;
int n;
int a[N]; int read()
{
int ans=0;
char ch=getchar();
while(ch<'0'||ch>'9')
ch=getchar();
while(ch>='0'&&ch<='9')
{
ans=(ans<<1)+(ans<<3)+ch-'0';
ch=getchar();
}
return ans;
} bool pd()
{
int ans=0;
for(int i=1;i<=n;++i)
ans^=a[i];
return ans;
} bool in()
{
n=read();
int ans=0;
for(int i=1;i<=n;++i)
a[i]=read();
return pd();
} void out(int aaa,int bbb)
{
printf("%d %d\n",aaa,bbb);
for(int i=1;i<=n;++i)
printf("%d ",a[i]);
} void work()
{
for(int i=1;i<=n;++i)
{
for(int j=1;j<=a[i];++j)
{
a[i]-=j;
if(!pd())
{
out(j,i);
return;
}
a[i]+=j;
}
}
} int main()
{
if(!in())
{
printf("lose\n");
return 0;
}
work();
return 0;
}

优化后的100分AC代码:其实就是减少了点常数

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define N 500001
using namespace std;
int n;
int a[N]; int read()//读入。
{
int ans=0;
char ch=getchar();
while(ch<'0'||ch>'9')
ch=getchar();
while(ch>='0'&&ch<='9')
{
ans=(ans<<1)+(ans<<3)+ch-'0';
ch=getchar();
}
return ans;
} int xorexptx(int x)//xor except x :求a数组内除第x个之外的异或值。
{
int ans=0;
for(int i=1;i<=n;++i)
if(i!=x)
ans^=a[i];
return ans;
} void out(int aaa,int bbb)//输出,不多解释。
{
printf("%d %d\n",aaa,bbb);
for(int i=1;i<=n;++i)
printf("%d ",a[i]);
} void work()
{
for(int i=1;i<=n;++i)
{
int num=xorexptx(i);//一个小小的优化:把其他n-1个数异或起来,就不用再多算了。
for(int j=1;j<=a[i];++j)
{
a[i]-=j;
if(!(num^a[i]))//异或上该数,然后再看能不能先手必败(此时计算机是先手)。
{
out(j,i);//如果能,就输出。
return;//返回,结束程序。
}
a[i]+=j;
}
}
} int main()
{
n=read();
int ans=0;
for(int i=1;i<=n;++i)
a[i]=read(),ans^=a[i];
if(!ans)//如果他们的异或和=0,那么先手必败,证明略。
{
printf("lose\n");
return 0;
}
work();//否则先手必胜。
return 0;
}

萌新第一次写题解,还望各位大佬多多支持。【Bye】

洛谷 P1247 取火柴游戏的更多相关文章

  1. 洛谷P1247取火柴游戏

    题目:https://www.luogu.org/problemnew/show/P1247 可以知道必败局面为n[1]^n[2]^...^n[k]=x=0: 而若x不等于0,则一定可以取一次使其变为 ...

  2. 洛谷P1247 取火柴游戏

    经典NIM游戏. 取XOR和即可. 注意输出方案时,找到大于异或和sum的,变为a[i] ^ sum即可. #include <cstdio> ; int a[N]; int main() ...

  3. 洛谷P1288 取数游戏II(博弈)

    洛谷P1288 取数游戏II 先手必胜的条件需要满足如下中至少 \(1\) 条: 从初始位置向左走到第一个 \(0\) 的位置,经过边的数目为偶数(包含 \(0\) 这条边). 从初始位置向右走到第一 ...

  4. 【洛谷】P1247取火柴游戏

    题目链接:https://www.luogu.org/problemnew/show/P1247 题意:nim取石子的题意,多了一个判断先手赢的话,输出先手第一把怎么拿,以及拿完之后每堆还剩多少. 题 ...

  5. P1247 取火柴游戏

    题目描述 输入k及k个整数n1,n2,-,nk,表示有k堆火柴棒,第i堆火柴棒的根数为ni:接着便是你和计算机取火柴棒的对弈游戏.取的规则如下:每次可以从一堆中取走若干根火柴,也可以一堆全部取走,但不 ...

  6. 洛谷——P1123 取数游戏

    P1123 取数游戏 题目描述 一个N×M的由非负整数构成的数字矩阵,你需要在其中取出若干个数字,使得取出的任意两个数字不相邻(若一个数字在另外一个数字相邻8个格子中的一个即认为这两个数字相邻),求取 ...

  7. 洛谷——P2252 取石子游戏

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

  8. 【洛谷】P1247 取火柴游戏(Nim)

    题目 传送门:QWQ 分析 蒟蒻根本不会博弈论..... 只知道异或和判断Nim游戏.. 不是很懂输出的选择,所以发一篇博客以待复习 代码 #include <bits/stdc++.h> ...

  9. 洛谷P1288 取数游戏II[博弈论]

    题目描述 有一个取数的游戏.初始时,给出一个环,环上的每条边上都有一个非负整数.这些整数中至少有一个0.然后,将一枚硬币放在环上的一个节点上.两个玩家就是以这个放硬币的节点为起点开始这个游戏,两人轮流 ...

随机推荐

  1. iOS一个简单的设置圆角不引起性能问题的分类

    http://www.cocoachina.com/articles/18756 iOS设置圆角矩形和阴影效果 https://www.cnblogs.com/rayshen/p/4900336.ht ...

  2. UIScrollView的API

    @property(nonatomic, weak) id<UIScrollViewDelegate> delegate; 滚动视图对象的委托. @property(nonatomic) ...

  3. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 表格:为所有表格的单元格添加边框

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  4. Pytorch本人疑问(1) torch.nn和torch.nn.functional之间的区别

    在写代码时发现我们在定义Model时,有两种定义方法: torch.nn.Conv2d()和torch.nn.functional.conv2d() 那么这两种方法到底有什么区别呢,我们通过下述代码看 ...

  5. 夯实Java基础(十九)——集合

    1.前言 集合在Java中的地位想必大家都知道,不用多BB了.无论是在我们现在的学习中还是在今后的工作中,集合这样一个大家族都无处不在,无处不用.在前面讲到的数组也是一个小的容器,但是数组不是面向对象 ...

  6. 三大JavaScript框架对比——AngularJS、BackboneJS和EmberJS

    <三大JavaScript框架对比——AngularJS.BackboneJS和EmberJS> 本文转载自  作者:chszs,博客主页:http://blog.csdn.net/chs ...

  7. [CMake笔记] CMake向解决方案添加源文件兼头文件

    回顾 在上一篇笔记里总结的时候说到,aux_source_directory这个函数在添加源码文件时,是不会把头文件添加进去的,这里就介经一下另外一个方法,也是我一直使用的. 添加文件*.cpp与*. ...

  8. Django学习 之后端视图与ajax

    一.Ajax简介 在此之前你一定需要先学习下JavaScript JSON 可见: 前端学习 之 JavaScript 之 JSON 1.简单介绍 我们以前知道的前端向后端发送数据的方式有: GET: ...

  9. H5中input输入框tppe为date时赋值(回显)

    1.当时间为2013-09-05时正常显示 <input class="form-control" name="applytime" type=" ...

  10. python中sorted方法和列表的sort方法使用

    一.基本形式 列表有自己的sort方法,器对列表进行原值排序,既然是原址排序,那显然元组不可能拥有这个方法,因为元组是不可修改的. 排序,数字.字符串按照ASCII,中文按照unicode从小到大排序 ...