POJ 1143 Number Game

关于【中孚计算机终端保密检查系统】的卸载 卸载中孚计算机终端保密检查系统 阅读详情

/*

http://acm.pku.edu.cn/JudgeOnline/problem?id=1143

博弈论(DFS + 状态记忆表 + 位运算), 假定一个走的人是A,第二个走的人是B
 A在当前状态下一定能够取胜的条件是:当前状态下存在一个数字,对于当A取走
 这个数字后的状态,B不管怎么取都得输(即B不能够绝对取胜)
 
 有了上面的分析就很容易看出这是一道博弈题,最终会形成一棵博弈树.假定最上面一层
 是A开始取,编号是1,那么所有A来取的都是奇数层,所有B来取的都是偶数层,奇数层对A来
 说, 各种取法之间是或的关系,即只要存在一种可以取胜的情况那么A就从当前层胜出,而
 偶数层对A来说是与的关系,即只有当所有取法对B来说都是输的时候A才获胜.(其实偶数层
 对B来说也是或的关系,只要有一种取法导致A输掉,B就获胜,所以相对A来说就是与关系了)
 */
 
#include <iostream>
#define MAX_N 20             //最大N
#define MAX_STATE 1048576    //2 ^ 20, 最大的状态数
using namespace std;

int exp[MAX_N + 1];          //记录2 ^ i
bool res[MAX_N + 1];         //记录结果,res[i] = true表示对A来说取数字 i + 1 是winning move
int record[MAX_STATE];       //记忆表, 其取值表示当前状态是winning move 还是 losing move
                             //1: winning move, 2: losing move, 0: not sure yet.
                             //比如: record[18] = 1表示对当前取者来说18是winning move;
                             //record[6] = 2,表示对对当前取者来说, 6不是winning move
int num, state, maxD;

bool dfs(int curState, int curLevel)
{
    //如果无数字可取, 则是losing move
    if(curState == 0)
        return false;
    int i, j, k, newState;
    bool can = true;
    bool finalCan = false;

    //遍历所有可取的数字
    for(i = 0; i <= maxD - 1; i++)
    {
        if(curState & exp[i])
        {
            //取这个数字, 将对应bit置为0
            newState = curState ^ exp[i];
            //取完后,要做一个判断,对于比所取数字大的其他数字,进行加法分解,
            //如果存在一个分解,分解得到的两个数字都已经被取过了,那么这个数不应该继续存在也需要被置0
            //比如:对于状态2 3 4 5,如果取了2,那么4肯定就也不能继续存在了
            for(j = i + 1 + 1; j <= maxD; j++)
            {
                if((newState & exp[j - 1]) == 0)
                    continue;
                for(k = 2; k <= j / 2; k++)
                {
                    if((newState & exp[k - 1]) == 0 && (newState & exp[j - k - 1]) == 0)
                    {
                        newState = newState ^ exp[j - 1];
                        break;
                    }
                }
            }
            int  t;

            //查看记忆表,看这个状态是否已经计算过了
            t = record[newState];
           
            bool type;
            if(t == 1)
                type = true;
            else if(t == 2)
                type = false;
            else //没有计算过的话需要进一步DFS
                type = dfs(newState, curLevel + 1);
            //对于第一层需要额外记忆,以便最终输出
            if(curLevel == 1)
            {
                if(!type)
                {
                    res[i] = true;
                    finalCan = true;
                    //写入记忆表
                    if(!record[curState]) record[curState] = 1;
                }
            }
            //如果对方下一步不可取,那么当前就是winning move
            else if(!type)
            {
                //记忆并返回
                if(!record[curState]) record[curState] = 1;
                return true;
            }
           
        }
    }
    if(curLevel == 1)
    {  
        if(finalCan)
        {
            if(!record[curState]) record[curState] = 1;
            return true;
        }
        else
        {
            if(!record[curState]) record[curState] = 2;
            return false;
        }
    }
    //能走到这儿说明对于自己的所有走法,对方都能够取得winning move,所以自己是losing move
    else
    {
        if(!record[curState]) record[curState] = 2;
            return false;
    }
}
int main()
{
    int i, digit, caseNum = 0;
    exp[0] = 1;
    for(i = 1; i < MAX_N; i++)
        exp[i] = exp[i - 1]<<1;
    while(cin>>num && num != 0)
    {
        caseNum++;
        state = 0;
        maxD = INT_MIN;
        memset(res, 0, sizeof(res));
        //memset(record, 0, sizeof(record)); 不要清0,因为记忆表还可以留给下一个case用
        for(i = 1; i <= num; i++)
        {
            cin>>digit;
            if(digit > maxD)
                maxD = digit;
            state = state | exp[digit - 1];
        }
        bool can = dfs(state, 1);
        cout<<"Test Case #"<<caseNum<<endl;
        if(!can)
            cout<<"There's no winning move."<<endl;
        else
        {
            cout<<"The winning moves are:";
            for(i = 0; i < maxD; i++)
            {
                if(res[i])
                    cout<<" "<<i + 1;
            }
            cout<<endl;
        }
        cout<<endl;
    }
    return 0;
   
}

`tokenizer.decode` 出现乱码或异常输出,怎么处理 摘要: 在使用Hugging Face Transformers库时,tokenizer.decode出现乱码或异常输出的解决方案包括:1)确保模型与分词器严格匹配,加载时使用trust_remote_code=True;2)谨慎处理特殊token,先保留所有token再针对性清理;3)校验模型输出token的维度和数值是否合法;4)通过convert_tokens_to_string替代解码;5)检查生成配置如max_new_tokens等参数。核心思路是确保模型与分词器逻辑对齐、输出token合法,必要 阅读详情

相关推荐

Node.js内存溢出?一招搞定JavaScript heap out of memory错误(附永久配置方案)

本文深入解析Node.js内存溢出问题,提供从临时调整到永久配置的完整解决方案。重点介绍通过设置`max-old-space-size`参数和`NODE_OPTIONS`环境变量来扩展JavaScript堆内存限制,适用于Webpack、Vite等构建工具的大型项目场景,并涵盖Windows、Linux/macOS多平台配置方法。

cake8的博客 1056

poj1143 记忆化搜索+状态压缩

题意:给定一个序列,轮到谁,取出一个数k删除,并删除i*k(i=1,2,3,.....),设k1为已经删除的数,同时删除k1*i+k*j,(i=1,2,3,.....;j同上 ),思考:考虑n为最大为20,而且ai最大为20,对于每个输入的数状态压缩,二进制的从右到左第几位为1说明此数被输入,先手必赢得状态是走完当前步,后手没有必赢状态,依据这个 从下往上dfs,枚举每种情况并记录状态,重复状态不...

OJBFOWE的博客 589

Linux密码破解(使用hydra工具和使用john暴力破解)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录一、使用hydra离线破解linux密码1.准备实验环境2.创建用户名字典3.hydra密码爆破二、复制shadow文件,使用john暴力破解1.实验环境1.复制linux的shadow文件2.john暴力破解 一、使用hydra离线破解linux密码 1.准备实验环境 ①攻击机:kali_linux 2021.2(ifconfig查询IP地址:192.168.119.132) ②靶机:Ubantu 16.04(ifconfig

weixin_46447549的博客 2万+

POJ 1143

题意:两个人玩游戏,初始集合S为大于1的正整数集,轮流写出一个大于1的数然后将:“1、所有这个数的倍数;2、这个数的倍数与前面已经删去的数的和”从集合S中删去,现在告诉你S的现状,求所有必胜走法的第一步。 题解:数的数量小于20,可以用位压缩dp,记录S中还剩哪些元素时是否是必胜态,然后通过记忆化搜索求出所有走第一步后是必败态的策略。 View Code 1 #include<...

weixin_30539835的博客 232

支持找回微信删除好友!一款人人可用的全能微信数据分析工具

找回删除好友、查看删除记录、恢复聊天信息....

1726

Win10自动更新怎么永久关闭?有效的Win10强制更新关闭方法

之前小编为大家分享过一些Win10彻底关闭Windows Update自动更新的方法,主要是通过一些如设置流量计费或借助一些专门的小工具来实现,但往往会发现,Win10自动更新就像打不死的小强,不管怎么关闭,之后还是会自动更新,让不少小伙伴颇为不爽。今天小编带来了这篇改进型教程,通过全方位设置,彻底关闭Win10自动更新,感兴趣的小伙伴不妨试试吧。 ...

jianai0602的博客 108万+

(弃疗搁置T)poj 1143 记忆化搜索+状压dp+dfs

Number Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3078   Accepted: 1235 Description Christine and Matt are playing an exciting game they just invente

cokomowang的专栏 550

电力远动入门:手把手解析IEC 60870-5-101规约的帧结构与报文交互(基于DL/T634.5101-2002)

本文深入解析IEC 60870-5-101规约的帧结构与报文交互,适用于电力远动通信系统。通过详细讲解规约的基础架构、控制域位定义及典型报文交互流程,帮助工程师快速掌握101规约的核心技术,提升电力自动化系统的调试与维护能力。

weixin_27076351的博客 244

ACM学习-POJ-1143-Number Game

菜鸟学习ACM,纪录自己成长过程中的点滴。 学习的路上,与君共勉。 ACM学习-POJ-1143-Number Game Number Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2914   Accepted: 1162

Colin丶 2909

STC单片机使用FatFs文件系统读取SD卡指定文件内容

STC单片机使用FatFs文件系统读取SD卡指定文件内容

perseverance51博客 2744

对雷达中相位补偿概念的一些理解

基于多普勒相位补偿的速度扩展方法和DBF测角,两者本质上都是对相位进行补偿。

qq_42235129的博客 4030

POJ-1143(状态压缩)

Number Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3432 Accepted: 1399 Description Christine and Matt are playing an exciting game they just invented: the Num...

weixin_30773135的博客 196

Qt EGLFS 图形后端详解

EGLFS (EGL Full Screen) 是Qt框架在嵌入式Linux系统中的高性能图形显示后端,它提供了直接基于EGL和OpenGL ES的硬件加速渲染解决方案。

浩瀚之水的专栏 513

poj 1143 Number Game 博弈 记忆化状态压缩搜索

poj 1143 Number Game http://poj.org/problem?id=1143 第一道博弈题,纠结了好久好久好久…… 题意:给定2到20的数,当选择一个数后,次数的倍数不可再选,已选的数的和不可再选,例如选择了2和3,则2*2, 2*3, 2*4,(2+3) , (2*2+ 3*5)...这些数都不能再选 问最先走那步可必胜   对于一个状态(已走好),若能走到

倩 921

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

poj1143Number Game

Description Christine and Matt are playing an exciting game they just invented: the Number Game. The rules of this game are as follows.  The players take turns choosing integers greater than 1. Fi

5年Java后端研发,分享个人读书学习笔记。 438

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

[POJ1143]Number Game

[POJ1143]Number Game 试题描述 Christine and Matt are playing an exciting game they just invented: the Number Game. The rules of this game are as follows.The players take turns choosing integers great...

weixin_30305735的博客 114

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

poj 1143 number game

题目比较长,题意不大好理解 现在把题意抽象一下,大概是以下意思: 1.给2~20的数字中的几个数组成数组a,其中是你可以选择的数字; 2.选择的规则如下: (1).如果选择了某个数字x,则数组a中是其倍数的数字将被划去; (2).假如数字n在数组a中,若n-x 的值并不在数组a中,则划去n; 3.当没有数字可以选取时,则此player失败; 4.让你找出先选的player选择哪个数字

GejinZ 1123

POJ 1143Number Game

Description Christine and Matt are playing an exciting game they just invented: the Number Game. The rules of this game are as follows. The players take turns choosing integers greater than 1. First,

zhengjihao的博客 426

POJ:1143 Number Game

题意:两个人玩游戏,初始集合S为大于1的正整数集,轮流写出一个大于1的数然后将:“1、所有这个数的倍数;2、这个数的倍数与前面已经删去的数的和”从集合S中删去,现在告诉你S的现状,求所有必胜走法的第一步。 题解:数的数量小于20,可以用位压缩dp,记录S中还剩哪些元素时是否是必胜态,然后通过记忆化搜索求出所有走第一步后是必败态的策略。 1 #include&lt;cstdio&gt; 2...

宴夜小丑的博客 358

poj1143 Number Game

发帖纪念我想了一整天的题,从早上到晚上现在 #include #include #include #include #include #include using namespace std; int dp[1<<19]; int dfs(int state) { if(dp[state]>=0)return dp[state]; for(int i=0;i<19;i++)

Slow_Wakler的专栏 637

poj1143(Number Game)

题目大意:        Christine和Matt玩一个游戏.游戏的规则如下:一开始有一列数字(2~20),有的被列出,有的没有列出.从Christine开始,两人轮流划去一个已被列出的数字.每划去一个数字,其他的所有的能被不在这个数列的数字的两两整线性表示的数也自动从数列

ll365594480的专栏 1376

Number Game poj1143

Description Christine and Matt are playing an exciting game they just invented: the Number Game. The rules of this game are as follows.The players take turns choosing integers greater than 1. First,...

weixin_33883178的博客 118

POJ 1143 Number Game(状压DP)

Description Christine and Matt are playing an exciting game they just invented: the Number Game. The rules of this game are as follows.  The players take turns choosing integers greater than 1. Fi

szhouan的博客 301

poj 1143 Number Game

博弈思想,状态压缩后记忆化搜索,必胜状态的条件为自状态存在必败状态。 g++ 0ms ac    c++wa 知道原因的留个言   #include #include #include #include #include using namespace std; int vis[600005], a[25], p2[25], cnt, ans[25]; //一共2^19种状态,19位2进制记

taozifish的专栏 759

POJ-1143-Number Game

这个题算DP吧,但用记忆化搜索和位运算就可以过~ 注意状态的压缩和记忆,题意搞了半天,后来参考了网上高人的题解和代码才搞懂题意,主要是线性表示那~ 代码: #include #include #include #include using namespace std; const int maxn=21; int n,pos,a[maxn],ans[maxn],cnt; int dp[209

z309241990的专栏 997
上一篇: POJ 1142 Smith Numbers
下一篇: POJ 1144 Network
bobten2008
博客等级 码龄18年 153粉丝 157原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值