中石油个人训练赛第18场 问题 J: 1-2-K Game Bash游戏变形&&博弈论

[提交] [状态] [命题人:admin]

 

题目描述

Alice and Bob play a game. There is a paper strip which is divided into n + 1 cells numbered from left to right starting from 0. There is a chip placed in the n-th cell (the last one).

Players take turns, Alice is first. Each player during his or her turn has to move the chip 1, 2 or k cells to the left (so, if the chip is currently in the cell i, the player can move it into cell i - 1, i - 2 or i - k). The chip should not leave the borders of the paper strip: it is impossible, for example, to move it k cells to the left if the current cell has number i < k. The player who can't make a move loses the game.

Who wins if both participants play optimally?

Alice and Bob would like to play several games, so you should determine the winner in each game.

 

输入

The first line contains the single integer T (1 ≤ T ≤ 100) — the number of games. Next T lines contain one game per line. All games are independent.

Each of the next T lines contains two integers n and k (0 ≤ n ≤ 109, 3 ≤ k ≤ 109) — the length of the strip and the constant denoting the third move, respectively.

 

输出

For each game, print Alice if Alice wins this game and Bob otherwise.

 

样例输入

复制样例数据

4
0 3
3 3
3 4
4 4

样例输出

Bob
Alice
Bob
Alice

题目大意:抽象出来就是,有n个石头,你每次只能拿  1 2 或者k 个,谁最后拿完谁赢,Alice先拿,问Alice是否会输。

题目思路:Bash游戏的变形,分两种情况:

1.k不是3的倍数

因为k不是3的倍数,所以3是必输局面,也就是谁碰到这个局面谁就输。

接下来我们考虑,如果n是3的倍数,先手先拿,后手绝对可以使当前局面成为3的倍数,先手拿1 后手拿2 ,2 1 ,先手拿 k 后手拿 3-(k%3) < 3{1 2},所以后手总有办法让先手陷入3的倍数的局面,这个倍数一点点减少,最后就会使得先手面临0 和 3的局面,这两种局面都是必输,所以 这种情况下先手必输。再考虑 n不是3的倍数,这种情况下,先手只要拿3的余数使得当前局面时3的倍数,那对手就面临必输局所以 先手必赢。

2.k是3的倍数

还是一样,首先考虑必输局面 k+1是必输局面,拿k我拿1,拿1我拿k,拿2的话因为k-1<k 又陷入了拿1 拿2 的环节又因为k是3的倍数,所以k-1一定不是3的倍数,所以拿2的话会让对手面临必赢局面,所以k+1是必输局面。这么考虑如果n%k+1==0,那么你拿一个对手都可以给你凑成 m*(k+1)的局面,到最后你还是必输局面。所以n%k+1==0是必输局面。如果n%k+1!=0,那么他的余数就是1 2 3 ....k 如果余数是k,那么必赢,因为可以一次拿到k使得对面陷入 n%k+1==0的局面,余数<k,问题就转换成了,谁想赢的话,谁就最后一个拿完使得对面陷入m*(k+1)的必输局面,所以右成了1 2 的问题,如果res%3==0 那么必输,否则必赢。

第一次玩博弈论,感觉好热血啊哈哈哈哈,附AC代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF=1e15+5;
const int maxn=1e6+8;
const double PI=acos(-1);
const ll mod=1e9+7;
ll n,m;
ll num[maxn];
int main()
{
    ll k;
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%lld%lld",&n,&k);
        if(k%3!=0)
        {
            if(n%3==0)
                printf("Bob\n");
            else
                printf("Alice\n");
        }
        else
        {
            if(n%(k+1)==0) printf("Bob\n");
            else
            {
                ll res=n%(k+1);
                if(res%3==0&&res!=k) printf("Bob\n");
                else printf("Alice\n");
            }
        }
    }
    return 0;
}

Bash博弈变形。

全部评论

相关推荐

各位前辈好,先说声抱歉,可能又是一篇“求骂醒”的帖子,但我真的需要一个方向。我的情况比大多数人都糟糕:双非软件工程,大四,马上毕业了,0实习经历,0工作经验。秋招根本没参加,原因很傻——我一头扎进了一个自己觉得“挺有意思”的项目里,天真的以为把项目做好工作自然会找上门。现在春招也快结束了,我才如梦初醒,发现简历投出去基本石沉大海。我没有什么能拿出手的背景,唯一能说的就是这个从后端到前端全栈独立开发的电影推荐平台。我知道在各位前辈眼里这大概率就是个小玩具,但我确实是下了功夫去琢磨的,它不是什么网上扒的代码,下面这些是我自己琢磨并落地的东西:项目概况:Spring&nbsp;Boot&nbsp;+&nbsp;MyBatis-Plus&nbsp;+&nbsp;Redis&nbsp;+&nbsp;JWT&nbsp;+&nbsp;MySQL&nbsp;+&nbsp;Vue3(前端是AI辅助生成的)我自己觉得花了心思的几个点:1.&nbsp;推荐算法落地:没有照搬别人的推荐逻辑。我是基于用户多维行为数据(评分、收藏、浏览时长)去计算标签权重,然后用“评分×log(热度+1)”的公式做加权排序;冷启动场景用热门数据兜底。推荐结果用Redis的ZSet缓存,用户行为一变化就主动删缓存触发重算。2.&nbsp;缓存体系设计:不是那种“面试八股文背完就扔”的表面理解。我实际遇到了缓存穿透和击穿的问题,然后自己用空值缓存+逻辑过期去解决。热门电影定时预热、批量查询用multiGet减少IO次数,还封装了MyCacheUtils通用模板,让整个项目其他模块也能复用这套缓存逻辑。3.&nbsp;并发与一致性:用Redis的SET&nbsp;NX&nbsp;EX实现了收藏/点赞的分布式锁,key精确到“用户+操作对象”级别,不是粗粒度的一锁全锁。异常回滚时Redis和MySQL数据一致性问题也思考并落地了。验证码的原子性校验用了Lua脚本来保证。4.&nbsp;性能是真实数据:我用JMeter做了2000并发的压测,引入Redis缓存体系后,推荐接口平均响应从6466ms降到155ms,吞吐量翻了一倍,缓存命中率干到98%以上。这些数据不是编的,是我自己反复调优跑出来的。说实话,做完这些的时候,看着压测报告我是挺兴奋的,觉得“这也算出活儿了吧”。但现实是,0实习好像成了我简历上的原罪,很多公司直接筛选条件就把我过滤了。所以我想跪求各位前辈指点我几个问题,每一条我都认真看、认真执行:1.&nbsp;关于简历:0实习的应届生,还有资格谈“项目亮点”吗?我这项目,是不是在专业面试官眼里就是一个“低配版培训项目”?如果这个项目还有救,该怎么在简历上呈现,才能让HR或者面试官至少愿意给我一个电话面试?如果没有,一个0实习的应届生到底该在简历上写什么?2.&nbsp;关于面试:如何用项目细节证明“我虽然没实习但真的能干活”?我挺怕面试官看到我没有实习经历就直接失去兴趣。真到了面试那一步,我该怎么引导对话,用上面这些技术细节去对抗“没实习=没工程经验”的刻板印象?比如缓存那块,怎么从“我解决了击穿”讲出一个有技术判断力和工程思维的完整故事?3.&nbsp;关于求职策略:错过了黄金窗口期,现在该冲什么样的公司?大厂我肯定不奢望了。现在这个时间点,我应该去投那些小公司和外包吗?要不要把薪资预期降到最低先入行再说?对于0实习的应届生,什么样的公司是真的有机会让我进去学技术、积累经验的?4.&nbsp;关于未来:如果现在直接找不到工作,我该怎么办?这段时间我想好了,如果实在是找不到研发岗,我要不要去干测试或者运维先入行?还是找家小公司被压榨一年攒个经验?还是干脆先找个其他工作边干边学等下一轮秋招?我什么建议都能接受。我知道自己起步晚了,代价得自己扛。现在唯一能做的就是面对现实,然后找到一条最有可能逆袭的路。希望前辈们能给我指个方向,即使简单几句“没救了”或者“还能救,去做XXX”我都非常感激。
jiestart:这简历肯定没面试的,你得包装个实习再加一个agent项目才有希望
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务