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;
   
}

大模型多智能体协作面试题及参考答案 在多智能体系统里,代理定义自身目标或效用函数的过程与系统架构、应用场景紧密相关。从本质上讲,目标是代理行为的导向,而效用函数则是对目标达成程度的量化评估。代理通常依据自身角色、系统全局需求以及与其他代理的交互关系来确立目标。比如在合作型 MAS 中,代理目标可能需要与全局目标对齐,像多个物流机器人协作完成货物配送时,每个机器人的目标会围绕 “高效完成分配任务”“避免路径冲突” 等展开,其效用函数可能涉及任务完成时间、能耗等指标的加权求和。目标定义的方式存在多种类型。 阅读详情

相关推荐

保姆级教程:用Kalibr搞定Intel D435i三目(RGB+双目)相机联合标定,附完整ROSbag录制避坑指南

本文详细介绍了如何使用Kalibr工具对Intel D435i三目相机(RGB+双目)进行高精度联合标定,包括硬件准备、ROSbag录制技巧、Kalibr标定实战及结果验证。特别针对实际工程中的常见问题提供了解决方案,帮助开发者提升SLAM和三维重建等应用的精度。

weixin_42524762的博客 405

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

手把手教你用XC7A35T FPGA搭建低成本机器视觉系统(含开发板选型指南)

本文详细介绍了如何利用AMD(原Xilinx)Artix-7系列中的XC7A35T FPGA芯片,搭建一套低成本的机器视觉系统。内容涵盖从芯片选型深度剖析、开发板(如黑金AX7035B)对比指南,到使用Vivado创建工程、编写图像处理模块(如RGB转灰度),以及资源优化和与上位机(如OpenCV)协同工作的完整流程,旨在为开发者提供一套可实践的高性价比硬件加速视觉解决方案。

beta5的博客 353

POJ 1143

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

weixin_30539835的博客 232

STM32H7 FMC驱动TFT-LCD原理与实战

TFT-LCD并行接口驱动是嵌入式人机交互的基础技术,其核心在于将显示控制器抽象为存储器映射设备,依托硬件时序控制器实现低开销、高确定性刷新。FMC(Flexible Memory Controller)作为STM32H7系列的关键外设,通过地址/数据总线复用、可配置读写时序及Bank分区机制,支持将ILI9341、ST7789等主流LCD控制器挂载为‘慢速异步存储器’,从而替代GPIO模拟8080时序或LTDC+DMA2D方案。该技术显著降低CPU占用率,提升帧率稳定性,适用于工业HMI、实时仪表盘等对响

weixin_32306683的博客 548

别再只盯着时序了!聊聊SDC里那些容易被忽略的‘配角’命令:工作条件、线载模型与面积约束

本文深入探讨了SDC(设计约束)中常被忽视的关键命令,包括set_operating_conditions、set_wire_load_model和set_max_area。这些‘配角’命令在芯片设计中扮演着至关重要的角色,影响时序收敛、功耗和面积优化。文章通过实际案例和最佳实践,揭示了如何正确配置工作条件、选择线载模型以及动态调整面积约束,以提升设计质量和效率。

weixin_26875109的博客 208

(弃疗搁置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

abaqus运行报错 WindowsError:[Error 2]

abaqus提交job总是提示“WindowsError [Error 2”,报这个错误,可能是由于安装其他软件改变了abaqus软件的路径导致,总结了看到的教程,按照下面的方法可以解决这个问题。 步骤一:找到你的abaqus安装路径(我是按照一个安装视频安装的,安装路径为SIMULI1),然后找到SIMULIA文件夹,点击进入后找到commands文件夹,将这个路径复制下来。 步骤二:我的电脑右键属性,在左侧中找到高级系统设置并...

az101za的博客 1万+

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

GD32F303片内FLASH实战:从地址映射到数据持久化存储

本文详细介绍了GD32F303片内FLASH的实战应用,从地址映射到数据持久化存储的全过程。通过解析FLASH的基础特性、安全操作区域规划、擦除写入读取的三重奏操作,以及工程化进阶技巧,帮助开发者高效利用片内FLASH进行数据存储。文章还提供了调试技巧和常见问题解决方案,特别适合嵌入式开发者在实际项目中应用。

weixin_26742753的博客 216

QNX侧触摸屏(TP)Bringup流程与源码深度解析

QNX侧TP Bringup的核心在于构建。

QQ_778132974的博客 477

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

2023年高教社杯全国大学生数学建模竞赛 E 题:《黄河水沙监测数据分析》真题解析与 MATLAB 解决方案

🏆 本文已收录于专栏:《滚雪球学数学建模(含历年真题)》,持续更新最新及历年数学建模竞赛资料,每篇内容力求做到“问题讲透、模型讲清、代码可用、论文可参考”,帮助你从零开始逐步建立完整的数学建模知识体系。

**My Coding Family** 904

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

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

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

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

[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

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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、付费专栏及课程。

余额充值