Again Stone Game

很明显是nim游戏,考虑到数据量,我们无法老老实实的求解sg值。
于是我选择打表找规律。
老老实实地打到sg[100]
我们就发现了规律。
sg[i] i为偶数时sg[i]=i/2
i为奇数时,如果sg[i-1]为偶数(此时i-1为偶数)那么sg[i]=sg[i-1]/2
如果sg[i-1]为奇数时,sg[i]=sg[i/2] (向下取整)

ok初始条件为sg[1]==0(边界)那么我们就可以递归求解了。
我们观察上述规律发现每次至少/2。而事实上很可能更快,所以复杂度应该小于O(nlogn)
##代码如下:

#include<iostream>
#include<algorithm>
using namespace std;
int rsg(int x) {
    if (x == 1)return 0;
    if (x & 1) {
        if ((x >> 1) & 1)
            return rsg(x >> 1);
        else
            return x >> 2;
    }else return x >> 1;
}

int main() {
    int T;cin >> T;
    for (int tcase = 1;tcase <= T;++tcase) {
        int n;cin >> n;
        int ans = 0;
        for (int i = 1;i <= n;++i) {
            int tmp;cin >> tmp;
            tmp = rsg(tmp);
            ans ^= tmp;
        }cout << "Case " << tcase << ": ";
        ans > 0 ? cout << "Alice\n" : cout << "Bob\n";
    }
}
kuangbin刷题题单详解(博弈论) 文章被收录于专栏

题单:https://vjudge.net/article/371

全部评论

相关推荐

KPLACE:首先是板面看起来不够,有很多奖,比我厉害。项目要精减,大概详细描述两到三个,要把技术栈写清楚,分点,什么算法,什么外设,怎么优化,不要写一大堆,分点,你写上去的目的,一是让别人知道你做了这个知识点,然后在面试官技术面的时侯,他知道你会这个,那么就会跟你深挖这个,然后就是个人评价改为专业技能
点赞 评论 收藏
分享
秋国🐮🐴:拿到你简历编号然后让你知道世间险恶
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务