CF1194D 1-2-K Game(博弈)

一道我觉得不错的博弈题目

思路

最下方有别人的链接,不是很理解那种思路。

写写自己的思路。

首先我们知道 Alice 先手,可走 1 步 2 步 或 k 步,可以确定的是 0 处为 Bob 的必胜态,也就是,0 处为后手的必胜态。

在这里,我将后手的必胜态称为Bob必胜态,简称B。同理,先手必胜态简称为A。

我们先不考虑k,考虑没有k的情况

没有k的时候

0 处 + 1 和 + 2 的 位 置 为 A , 0 处 + 3 的 地 方 为 B 0处 +1 和 +2 的位置为A,0 处 + 3 的地方为B 0+1+2A0+3B

再 往 后 推 导 , 我 们 可 以 发 现 , 跳 到 B 的 人 必 胜 , 所 以 每 个 人 的 目 标 都 是 跳 到 B 。 将 3 处 看 成 0 处 , 继 续 往 后 推 。 我 们 可 以 发 现 , 当 n % 3 = = 0 时 , B o b 必 胜 , 当 n % 3 ! = 0 时 , A l i c e 必 胜 。 再往后推导,我们可以发现,跳到B的人必胜,所以每个人的目标都是跳到B。 将3处看成 0 处,继续往后推。我们可以发现,当n\%3 == 0时,Bob必胜,当n\%3!= 0时,Alice必胜。 BB30n%3==0Bobn%3!=0Alice

也 就 是 说 : 不 考 虑 k 时 , 3 的 倍 数 的 位 置 为 B , 其 他 为 A 也就是说:不考虑k时,3的倍数的位置为B,其他为A k3BA

我们再在这个基础上,考虑含有k的情况.

一、 首 先 考 虑 k % 3 = = 1 的 情 况 , 我 们 知 道 这 时 候 从 B 往 后 + 1 或 + 2 或 + k 的 状 态 应 该 是 A , 而 对 于 每 个 B , 在 原 先 的 基 础 上 + k 依 然 还 是 为 A , 对 原 先 的 结 论 没 有 影 响 , 没 有 修 改 。 首先考虑k\%3 == 1的情况,我们知道这时候从 B 往后+1 或 +2 或 +k 的状态应该是A,而对于每个B,在原先的基础上 +k 依然还是为A,对原先的结论没有影响,没有修改。 k%3==1B+1+2+kAB+kA

二、 同 理 , 当 k % 3 = = 2 时 , 也 没 有 造 成 影 响 同理,当k\%3 == 2时,也没有造成影响 k%3==2

三、 最后我们考虑k%3   ==   0的情况 \textbf{最后我们考虑k\%3 == 0的情况} 最后我们考虑k%3 == 0的情况
经 过 推 导 可 发 现 , 它 是 一 个 以 k + 1 的 长 度 为 周 期 的 循 环 节 , 对 于 每 一 个 周 期 [ 1 , k + 1 ] 中 的 第 p o s 个 位 置 , p o s % 3 ! = 0 处 以 及 第 p o s = = k 处 都 是 A , 其 他 位 置 则 为 B 。 经过推导可发现,它是一个以k + 1的长度为周期的循环节,对于每一个周期[1,k+1]中的第pos个位置,pos\%3 != 0 处 以及 第pos == k处都是A,其他位置则为B。 k+1[1,k+1]pospos%3!=0pos==kAB

在三中,Alice获胜只有两种情况: n % ( k + 1 ) % 3 ! = 0 n\%(k +1) \%3 != 0 n%(k+1)%3!=0以及 n % ( k + 1 ) = = k n\%(k +1) == k n%(k+1)==k

n % ( k + 1 ) % 3 ! = 0 n\%(k +1) \%3 != 0 n%(k+1)%3!=0也就是之前的基础。

n % ( k + 1 ) = = k n\%(k +1) == k n%(k+1)==k,这时候Alice有能力跳至B(跳k步),此时Alice能赢。

其余的都是B。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int t;
int main(){
    scanf("%d", &t);
    while(t--){
        int n, k;
        scanf("%d %d", &n, &k);
        if(k % 3 == 0)
            if(n % (k + 1) % 3 != 0 || n % (k + 1) == k)
                puts("Alice");
            else
                puts("Bob");
        else
            if(n % 3 != 0)
                puts("Alice");
            else
                puts("Bob");
    }
    return 0;
}

参考来源

https://www.cnblogs.com/think-twice/p/11190574.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值