首页 > 其他分享 >蓝桥杯练习题——博弈论

蓝桥杯练习题——博弈论

时间:2024-03-25 17:59:22浏览次数:22  
标签:练习题 return int res scanf 博弈论 蓝桥 printf include

1.必胜态后继至少存在一个必败态
2.必败态后继均为必胜态
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Nim游戏

在这里插入图片描述

思路

2 3,先手必赢,先拿 1,然后变成 2 2,不管后手怎么拿,先手同样操作,后手一定先遇到 0 0
a1 ^ a2 ^ a3 … ^ an = 0,先手必败,否则先手必胜

#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int a[N];
int n;

int main(){
    cin>>n;
    for(int i = 1; i <= n; i++) cin>>a[i];
    int res = a[1];
    for(int i = 2; i <= n; i++) res ^= a[i];
    if(res == 0) cout<<"No";
    else cout<<"Yes";
    return 0;
}

// 求先手必胜第一次怎么拿
#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int a[N];
int n;

int main(){
    cin>>n;
    for(int i = 1; i <= n; i++) cin>>a[i];
    int res = a[1];
    for(int i = 2; i <= n; i++) res ^= a[i];
    if(res == 0) cout<<"lose";
    else{
        for(int i = 1; i <= n; i++){
            if((a[i] ^ res) >= a[i]) continue;
            printf("第%d堆 拿%d个\n", i, (a[i] - (a[i] ^ res)));
            a[i] = a[i] ^ res;
            break;
        }
    }
    for(int i = 1; i <= n; i++) printf("%d ", a[i]);
    return 0;
}

台阶-Nim游戏

在这里插入图片描述

思路

如果拿偶数的台阶,你拿多少下去,我就拿多少下去,所以只需要看奇数台阶
如果奇数位 a1 ^ a3 ^ a5 ^ … ^ an = 0,先手必败

#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int a[N];
int n;

int main(){
    scanf("%d", &n);
    for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
    int res = a[1];
    for(int i = 3; i <= n; i += 2){
        res ^= a[i];
    }
    if(res) printf("Yes\n");
    else printf("No\n");
    return 0;
}

集合-Nim游戏

在这里插入图片描述

思路

如果 SG(x1) ^ SG(x2) ^ SG(x3) ^ … ^ SG(xn) = 0,先手必败
在这里插入图片描述
能到 0 那就是 1,能到 1 那就是 0,同时能到 1 和 0,那就是 2

#include<iostream>
#include<cstring>
#include<unordered_set>
using namespace std;
const int N = 110, M = 1e4 + 10;
int a[N], b[M];
int n, m;

int sg(int x){
    if(b[x] != -1) return b[x];
    unordered_set<int> s;
    for(int i = 0; i < n; i++){
        int t = a[i];
        if(x >= t) s.insert(sg(x - t));
    }
    for(int i = 0; ; i++){
        if(!s.count(i)){
            b[x] = i;
            return b[x];
        }
    }
}

int main(){
    memset(b, -1, sizeof(b));
    scanf("%d", &n);
    for(int i = 0; i < n; i++) scanf("%d", &a[i]);
    scanf("%d", &m);
    int res = 0, x;
    for(int i = 0; i < m; i++){
        scanf("%d", &x);
        res ^= sg(x);
    }
    if(res) printf("Yes\n");
    else printf("No\n");
    return 0;
}

拆分-Nim游戏

在这里插入图片描述
在这里插入图片描述

思路

一个数分成两个数,再异或

#include<iostream>
#include<cstring>
#include<unordered_set>
using namespace std;
const int N = 110;
int b[N];
int n;

int sg(int x){
    if(b[x] != -1) return b[x];
    unordered_set<int> s;
    for(int i = 0; i < x; i++){
        for(int j = 0; j <= i; j++){
            s.insert(sg(i) ^ sg(j));
        }
    }
    for(int i = 0; ; i++){
        if(!s.count(i)){
            b[x] = i;
            return b[x];
        }
    }
}

int main(){
    memset(b, -1, sizeof(b));
    scanf("%d", &n);
    int res = 0, x;
    for(int i = 0; i < n; i++){
        scanf("%d", &x);
        res ^= sg(x);
    }
    if(res) printf("Yes\n");
    else printf("No\n");
    return 0;
}

标签:练习题,return,int,res,scanf,博弈论,蓝桥,printf,include
From: https://blog.csdn.net/qq_62734493/article/details/137013811

相关文章

  • 第九章总练习题
    赫尔曼·阿曼杜斯·施瓦茨大学初期攻读化学,在魏尔斯特拉斯等人的建议下改攻读数学。施瓦茨在哈雷、哥廷根和柏林工作,范围涉及函数论、微分几何和变分学。以他为名的有柯西-施瓦茨不等式、施瓦茨导数、施瓦茨-克里斯托费尔映射、施瓦茨反射原理和施瓦茨引理。 施瓦茨,即德国数学......
  • P8687 [蓝桥杯 2019 省 A] 糖果
    题意:n个零食,每个零食有k种配料,一共有m种配料。问最少吃几包零食,可以吃到所有配料。n<=100,m<=20,k<=m。思路:最优化问题,如果n<=20可以直接bf,这里m<=20,对m进行状态压缩,正确的解法应该是线性dp+状态压缩。总结:很容易陷入一个哈密顿路径思路的误区中,在哈密顿路径中,一......
  • 数学算法(算法竞赛、蓝桥杯)--判定质数试除法
    1、B站视频链接:G06判定质数试除法_哔哩哔哩_bilibili题目链接:【深基7.例2】质数筛-洛谷#include<bits/stdc++.h>usingnamespacestd;boolis_prime(intx){ if(x==1)return0;//特判1不是质数 for(inti=2;i*i<=x;i++){//枚举小的那个到根号n即可 if(x%i==0......
  • P8716 [蓝桥杯 2020 省 AB2] 回文日期
    思路解析本题与洛谷的P2010[NOI......
  • Scala函数练习题
    1、定义一个高阶函数,按照指定的规则对集合里面的每个元素进行操作比如:Array(“hh”,“red”,“java”,“hadoop”)规则:对集合中每个元素进行操作,得到集合每个元素的长度objecttest{defmain(args:Array[String]):Unit={vallist=Array("hh","red","ja......
  • 2024 蓝桥打卡Day18
    洛谷刷题P8682[蓝桥杯2019省B]等差数列题目[P8682[蓝桥杯2019省B]等差数列](https://www.luogu.com.cn/problem/P8682)题解P8682[蓝桥杯2019省B]等差数列题目P8682[蓝桥杯2019省B]等差数列题解importjava.util.Arrays;importjava.util.S......
  • Scala练习题
    1、定义一个高阶函数,按照指定的规则对集合里面的每个元素进行操作比如:Array(“hh”,“red”,“java”,“hadoop”)规则:对集合中每个元素进行操作,得到集合每个元素的长度packageljobjectaaa{defmain(args:Array[String]):Unit={vallist=Array("......
  • 第十二届蓝桥杯省赛C&C++ 研究生组
    十二届省赛题第十二届蓝桥杯省赛C&C++研究生组-卡片第十二届蓝桥杯省赛C&C++研究生组-直线第十二届蓝桥杯省赛C&C++研究生组-货物摆放第十二届蓝桥杯省赛C&C++研究生组-路径第十二届蓝桥杯省赛C&C++研究生组-时间显示第十二届蓝桥杯省赛C&C++研究生组-砝码称重......
  • [暴力题解系列]2023年蓝桥杯-整数删除(30分)
    这题暴力最多30分,但是30分也是分,做暴力的人不能贪心,拿到分就是赚了。​ 这题核心烦人点在于他数据分层断崖,就只有前3个点能做到稳过。用的思路就是链表,但不是用指针存的,而是用数组下标为标记存的,只是我觉得因为这样好写一些。链表方便修改左右连接位置,所以越到后面就越能省下查询......
  • 【算法双周赛】蓝桥杯【小白赛】
    坤星球【算法赛】问题描述坤星球是一颗十万光年之外的星球,相比于地球的时间流逝它的时间流逝更加缓慢,坤星球1年等于地球2.5年。现在问你,2024坤年等于地球多少年?注意:答案输出阿拉伯数字,不能为浮点数。输入格式本题为填空题,无需输入即可作答。输出格式输出一个数......