【蓝桥杯集训·每日一题】AcWing 4005. 取石子游戏

news/2024/10/30 23:15:28/

文章目录

  • 一、题目
    • 1、原题链接
    • 2、题目描述
  • 二、解题报告
    • 1、思路分析
      • 1. 正解
      • 2. 打表找规律
    • 2、时间复杂度
    • 3、代码详解
  • 三、知识风暴
  • 博弈论

一、题目

1、原题链接

4005. 取石子游戏

2、题目描述

Alice 和 Bob 正在玩一个取石子游戏。

共有 n 个石子,双方轮流采取行动。

每当轮到一人行动时,该名玩家需要从石子堆中取走恰好 1 或 2 或 k 个石子。

如果轮到一人行动时,已经没有石子可取,则该名玩家失败。

已知,双方都会采取最优策略,且 Alice 率先行动。

请问,最终谁将获胜

输入格式

第一行包含整数 T,表示共有 T 组测试数据。

每组数据占一行,包含两个整数 n,k。

输出格式

每组数据输出一行结果,如果 Alice 获胜,则输出 Alice,否则输出 Bob

数据范围

前三个测试点满足,1≤T≤10
所有测试点满足,1≤T≤100,0≤n≤109,3≤k≤109

输入样例

4
0 3
3 3
3 4
4 4

输出样例

Bob
Alice
Bob
Alice

二、解题报告

1、思路分析

思路来源:y总讲解视频
y总yyds

1. 正解

  • 先手必胜态:可以走到一个必败态。
  • 先手必败态:走不到任何一个必败态。

直接给出结论:具体证明过程见y总讲解视频

  1. k不是3的倍数
    1. n不是3的倍数,先手必胜。
    2. n是3的倍数,先手必败。
  2. k是3的倍数,计算n%(k+1)的余数r
    1. r和k相等或r不是3的倍数,先手必胜。
    2. r<k而且r是3的倍数,先手必败。

2. 打表找规律

2、时间复杂度

时间复杂度为O(n)

3、代码详解

正解

#include <iostream>
using namespace std;
int T,n,k;
int main(){cin>>T;while(T--){cin>>n>>k;if(k%3){if(n%3) cout<<"Alice"<<endl;else cout<<"Bob"<<endl;}else{int r=n%(k+1);if(r==k||r%3) cout<<"Alice"<<endl;else cout<<"Bob"<<endl;}}return 0;
}

打表找规律

#include <iostream>
using namespace std;
const int N=110;
int n,k;
int f[N];
int main(){cin>>n>>k;f[0]=0;for(int i=1;i<=n;i++){int d[]={1,2,k};for(int j=0;j<3;j++){int x=d[j];if(i>=x&&!f[i-x]) f[i]=1;}}for(int i=0;i<=n;i++) cout<<f[i]<<' ';return 0;
}

三、知识风暴

博弈论


http://www.ppmy.cn/news/33033.html

相关文章

03 安装gcc编译环境,scons编译程序小试牛刀

安装mingw 我的电脑已经安装过&#xff0c;下面主要说下配置环境我们将mingw的路径和scons的虚拟环境路径添加到临时的环境变量,这样做的好处是使用的时候添加&#xff0c;不与其它版本的全局的环境变量冲突。后期我编译ARM程序时把gcc临时环境变量改为arm-gcc路径即可。写一个…

Unity自带类 --- Time类

1.在Unity中&#xff0c;自己写的类&#xff08;脚本&#xff09;的名字不能与Unity已有的类的名字相同&#xff0c;如果相同的话就会导致一个错误 --- 当我们在脚本中想调用Unity自带的类的时候&#xff0c;我们只能够调用到自己写的那个与其重名的类&#xff08;就近原则调用…

第一个 Qt 程序

第一个 Qt 程序 “hello world ”的起源要追溯到 1972 年&#xff0c;贝尔实验室著名研究员 Brian Kernighan 在撰写 “B 语言教程与指导(Tutorial Introduction to the Language B)”时初次使用&#xff08;程序&#xff09;&#xff0c;这是目前已 知最早的在计算机著作中将…

【深度强化学习】(8) iPPO 模型解析,附Pytorch完整代码

大家好&#xff0c;今天和各位分享一下多智能体深度强化学习算法 ippo&#xff0c;并基于 gym 环境完成一个小案例。完整代码可以从我的 GitHub 中获得&#xff1a;https://github.com/LiSir-HIT/Reinforcement-Learning/tree/main/Model 1. 算法原理 多智能体的情形相比于单智…

在visual studio 2022 C++中配置最新版OpenCV和可能错误解决方案

前面我们写了一篇博文有关在C#中配置OpenCV&#xff0c;但C#版本的OpenCV的学习资源相对较少&#xff0c;C版的和Python版的比较多。这里先说说C版的如何配置吧&#xff01;总共完成四步即可使用起来。 文章目录一、下载并安装OpenCV1、下载OpenCV2、安装OpenCV二、配置环境1、…

容器的老祖宗LXC和Docker的关系

一、什么是LXC&#xff1f; LXC&#xff08;Linux Container的缩写&#xff09;是一个基于Linux内核的容器虚拟化技术&#xff0c;它提供了一种轻量级、快速、简便的方式来创建和管理系统容器。与传统虚拟化技术不同&#xff0c;LXC并不会模拟硬件&#xff0c;而是利用Linux内…

格式化输出流及转义

格式化输出流大全格式化输出流操作std::fixed以小数点模式输出浮点数std::scientific以科学计数法输出浮点数std::defaultfloat以默认方式输出浮点数std::setprecision设置小数精度&#xff0c;例如设置为2&#xff0c;则精度为2std::dec以十进制输出std::hex以十六进制输出std…

蓝桥杯嵌入式第四课--定时器

前言蓝桥杯对于定时器这部分的考察主要集中在定时器中断、PWM输出以及输入捕获三个方面&#xff0c;本节课着眼于应用&#xff0c;介绍一下定时器的使用。定时器中断一、基础概念对没接触过定时器的新手来说&#xff0c;如果想要快速上手定时器的使用&#xff0c;首先要先对定时…