牛客多校第一场 A. Alice and Bob (暴力SG)

题目大概

有两堆石子,有两个人拿,一个人从一堆中拿k个,那么就必须从另一堆中拿sk个,Alice先拿,问是否必赢。

解题:

数据不大,看到前20名队伍没有推结论做的。。除了打表就是暴力,其实打表还是暴力,但是打1000多行的表也太恐怖了吧。。暴力就是暴力处理每一种状态下SG所有情况,SG[n][m]就表示当前第一堆石子数量为n,第二堆石子数量为mSG函数,那么再枚举一个ks,暴力即可,这打眼一看好像复杂度很恐怖,这难道就是高手们的经验吗。。

注意:一开始我用了int数组判断truefalseT到飞起,后来换成bool数组,八百毫秒就过了。

哦记得,不要忘了处理SG(00)的情况

#include <iostream>

using namespace std;

const int N = 5002;
bool sg[N][N];

void cal(int n, int m) {
    for (int k = 1; n + k < N; k++) {
        for (int s = 0; m + s * k < N; s++) {
            sg[n + k][m + k * s] = 1; //先拿第一堆
        }
    }
    swap(n, m);
    for (int k = 1; n + k < N; k++) {
        for (int s = 0; m + s * k < N; s++) {
            sg[m + k * s][n + k] = 1; //先拿第二堆
        }
    }
}

int main() {
    cal(0 ,0);
    for (int i = 1; i < N; i++) {
        for (int j = 0; j < N; j++) {
            if (!sg[i][j]) {
                cal(i, j);
            }
        }
    }
    
    int t;
    cin >> t;
    while (t--) {
        int n, m;
        cin >> n >> m;
        if (!sg[n][m]) puts("Bob");
        else puts("Alice");
    }

    return 0;
}
posted @   Xxaj5  阅读(55)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示