取火柴-博弈论

取火柴 (10分)
C时间限制:3000 毫秒 | C内存限制:3000 Kb
题目内容:
有n个火柴棍,两个游戏玩家a和b轮流取,规则是第一次取的人最少取1根,最多取n-1根,随后每人最多只能取对方上一次取的数目

的2倍,最少取1根。谁取到最后一根为胜者。试问先取的人是赢还是输。

输入描述
n
输出描述
1表示胜,0表示输
输入样例
3
输出样例
0

解析:说白了,就是每个人只能取1或者2.(双方都不想因为自己而让对方的选择余地变大)

#include<iostream>
using namespace std;

int main()
{
    int n,ans=1;
    cin>>n;
    if(n%2==0){
        ans=1;
    }
    else if(n%2==1){
        ans=0;
    }
    cout<<ans<<endl;
    return 0;
}
时间: 2024-12-20 20:50:58

取火柴-博弈论的相关文章

【博弈论】取火柴游戏

取火柴游戏 时间限制: 1 Sec  内存限制: 128 MB 题目描述 输入k及k个整数n1,n2,…,nk,表示有k堆火柴棒,第i堆火柴棒的根数为ni:接着便是你和计算机取火柴棒的对弈游戏.取的规则如下:每次可以从一堆中取走若干根火柴,也可以一堆全部取走,但不允许跨堆取,也不允许不取. 谁取走最后一根火柴为胜利者. 例如:k=2,n1=n2=2,A代表你,P代表计算机,若决定A先取: A:(2,2)→(1,2)    {从一堆中取一根} P:(1,2)→(1,1)    {从另一堆中取一根}

【贪心】取火柴游戏

[贪心]取火柴游戏 题目描述 输入k及k个整数n1,n2,…,nk,表示有k堆火柴棒,第i堆火柴棒的根数为ni:接着便是你和计算机取火柴棒的对弈游戏.取的规则如下:每次可以从一堆中取走若干根火柴,也可以一堆全部取走,但不允许跨堆取,也不允许不取. 谁取走最后一根火柴为胜利者. 例如:k=2,n1=n2=2,A代表你,P代表计算机,若决定A先取: A:(2,2)→(1,2)    {从一堆中取一根} P:(1,2)→(1,1)    {从另一堆中取一根} A:(1,1)→(1,0) P:(1,0)

P1247 取火柴游戏

题目描述 输入k及k个整数n1,n2,…,nk,表示有k堆火柴棒,第i堆火柴棒的根数为ni:接着便是你和计算机取火柴棒的对弈游戏.取的规则如下:每次可以从一堆中取走若干根火柴,也可以一堆全部取走,但不允许跨堆取,也不允许不取. 谁取走最后一根火柴为胜利者. 例如:k=2,n1=n2=2,A代表你,P代表计算机,若决定A先取: A:(2,2)→(1,2) {从一堆中取一根} P:(1,2)→(1,1) {从另一堆中取一根} A:(1,1)→(1,0) P:(1,0)→ (0,0) {P胜利} 如果

P1247 取火柴游戏 (奇异局势)

题目链接 题目描述 输入k及k个整数n1,n2,…,nk,表示有k堆火柴棒,第i堆火柴棒的根数为ni:接着便是你和计算机取火柴棒的对弈游戏.取的规则如下:每次可以从一堆中取走若干根火柴,也可以一堆全部取走,但不允许跨堆取,也不允许不取. 谁取走最后一根火柴为胜利者. 编一个程序,在给出初始状态之后,判断是先取必胜还是先取必败,如果是先取必胜,请输出第一次该如何取.如果是先取必败,则输出“lose”. 输入格式 第一行,一个正整数k 第二行,k个整数n1,n2,…,nk 输出格式 如果是先取必胜,

洛谷P1247 取火柴游戏 数学题 博弈论

这题就是NIM取石子游戏,但是NIM取石子方案并不是单一的,而是有多种方案的,现在让我们求字典序最小的方案,其实还是简单的,作为先手,如果是必胜局面,那我们肯定第一步把所有子异或和变为零 ,这样对于对方,这就是一个必败局面了 2.那我们来考虑怎么把局面变成必败局面呢,换句话说,怎么判断这一堆取不取呢, 假设a[ i ]不取他们的异或值为 y ,那么如果我们把a[ i ]变成 y 那么 y^y=0 就必胜了那就只要判断 if a[ i ]>=y 就可知在这一位上改变可不可行了,要字典序最小那就i从

BZOJ 3895 取石子 博弈论+记忆化搜索

题目大意:给定n堆石子,两人轮流操作,每个人可以合并两堆石子或拿走一个石子,不能操作者输,问是否先手必胜 直接想很难搞,我们不妨来考虑一个特殊情况 假设每堆石子的数量都>1 那么我们定义操作数b为当前石子总数+当前堆数-1 若b为奇数,则先手必胜,否则后手必胜 证明: 若当前只有一堆,则正确性显然 否则: 若b为奇数,那么先手只需进行一次合成操作,此时操作数会-1,且仍不存在大小为1的堆 因此只需要证明b为偶数时先手必败即可 若先手选择了合成操作,那么操作数-1且不存在大小为1的堆,状态回到了b

POJ 2234 Matches Game(取火柴博弈1)

传送门 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int main() { int n; while(~scanf("%d",&n)) { int a,res=0; for(int i=0;i<n;i++) { scanf("%d",&a); res^

HDU 2509 Be the Winner(取火柴博弈2)

传送门 #include<iostream> #include<cstdio> #include<cstring> using namespace std; int main() { int n; while(~scanf("%d",&n)) { int a,res=0; int c=0,g=0; for(int i=0;i<n;i++) { scanf("%d",&a); if(a>=2) c++;

P1247 取火柴游戏(异或理论)

https://www.luogu.com.cn/problem/P1247 #include <bits/stdc++.h> using namespace std; #define int long long const int maxn = 5e5 + 5; int n; int a[maxn]; signed main(){ //freopen("in","r",stdin); ios::sync_with_stdio(0); cin >&