题解 | #自杀游戏#

自杀游戏

https://ac.nowcoder.com/acm/problem/17865

基础的博弈论,如果我可以通过一个状态让对方必死,我就能活;反之我必死。

值得注意的是:

调快 [a,b][a,b] 秒,也可以不调

据此设 life(x)life(x) 表示剩余 xx 秒时先手是否能活,加一个记忆化即可保证每个状态的计算只进行一次,据此复杂度为 O(nab)O(n|a-b|)

实现细节可以参见代码。

#include<cstdio>
#include<cstring>
int t, a, b;
const int N = (int) 1e5 + 5;
int ok[N];
bool life(int x){
    if (ok[x] != -1) return ok[x];
    if (x == 0) return ok[x] = 0; // 必死
    if (x <= a) return ok[x] = !life(x - 1); // 不能接着调了
    bool flag = !life(x - 1); // 不调
    for (int y = a; y <= x && y <= b; ++y)
        flag |= !life(x - y - 1); // 选一个调的时间
    return ok[x] = flag;
}
int main(){
    memset(ok, -1, sizeof(ok));
    scanf("%d%d%d", &t, &a, &b);
    puts(life(t) ? "Alice" : "Bob");
}
全部评论

相关推荐

点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-01 10:56
点赞 评论 收藏
分享
不要停下啊:大二打开牛客,你有机会开卷了,卷起来,去找课程学习,在牛客上看看大家面试笔试都需要会什么,岗位有什么需求就去学什么,努力的人就一定会有收获,这句话从来都经得起考验,像我现在大三了啥也不会,被迫强行考研,炼狱难度开局,啥也不会,找工作没希望了,考研有丝丝机会
点赞 评论 收藏
分享
本神尊:看来是没招到小红薯上的人
点赞 评论 收藏
分享
评论
3
1
分享

创作者周榜

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