一开始看这道博弈题的时候我就用很常规的思路去分析了,首先先手取1或者2个coin后都会使剩下的coin变成线性排列的长条,然后无论双方如何操作都是把该线条分解为若干个子线条而已,即分解为若干个子游戏而已,我想起刘汝佳的大白书上有类似的例题(不过复杂好多),于是便用同样的方法去做了,以sg(x)表示当前连续x个coin的状态的sg函数值,则当从左侧起分别取一个或相邻的两个时,不难得出其后继状态:sg(y)^sg(x-1-y)(0<=y<=(x-1)/2),sg(y)^sg(x-2-y)(0<=y<=(x-2)/2),在这里因为每次操作都把某段连续的x个coin分解为两段coin(当从头或尾取时即分解为0和x-1或x-2这两段coin),所以要用异或(^),详见大白书的sg定理(游戏和的sg函数等于各子游戏sg函数的Nim和。这样,就可以把各个子游戏分而治之)。推到这里后,就可以用递推求出每个sg(x)的值(不用递归,因为y总是比x小的,求解顺序已经很明显):

 bool vis[];
int sg[]= {,,}; void init(int n= ){
for(int i=; i<=n; ++i){
memset(vis,,sizeof(vis));
for(int j=; j<=(i-)/; ++j)
vis[sg[j]^sg[i--j]]= ;
for(int j=; j<=(i-)/; ++j)
vis[sg[j]^sg[i--j]]= ;
for(int k=; ; ++k)
if(!vis[k]){
sg[i]= k;
break;
}
}
}

  在这里为什么只求出n=10000的数据呢?因为当n=10^5时已经很慢了,我暂时也不知道怎么优化程序使其加速,所以只好先打表找规律了,无奈我输出了前100+的sg函数还是看不出有什么规律,可是当我看到当n大于0时好像所有的sg函数都不为0,而先手无论如何取总会把该环变成一个长条的,那就是说先手必败咯?带着这个疑问我再认真分析了下,确实如果对于一开始是操作一个长条的的话,先手是必胜的,因为只需从中间取1或者2个coin使其变成左右两端数量相等的coin,那么就转变为一个很弱智的问题了。分析到这里后我才猛然醒悟,当先手取后(coin环变成了线性排列的coin),这时后手只需如上述所说从中间截断把它变成两段相等的coin即可(至于如何变看x的奇偶性取1或2即可)。有了这个大胆的猜想后,我试着用代码提交:

 #include<cstdio>

 int main(){
int n;
while(~scanf("%d",&n),n)
puts(n>?"Bob":"Alice");
return ;
}

  然后,竟然过了!!实在太吃惊了,竟然是如此的一道神题,不用想得这么复杂的,好吧,以后分析类似的题目当钻进死胡同时不妨跳出来重新审视下题意,尝试用最简单的方法去思考,也未尝不可。

  (因为今天的天气问题,手指不是很灵活,草草写好的博客,将就着看下吧~~)

POJ 2484 A Funny Game(神题!)的更多相关文章

  1. poj 1011 Sticks ,剪枝神题

    木棒 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 118943 Accepted: 27429 Description 乔治拿 ...

  2. BUAA 724 晴天小猪的神题(RMQ线段树)

    BUAA 724 晴天小猪的神题 题意:中文题,略 题目链接:http://acm.buaa.edu.cn/problem/724/ 思路:对于询问x,y是否在同一区间,可以转换成有没有存在一个区间它 ...

  3. poj 3080 Blue Jeans(水题 暴搜)

    题目:http://poj.org/problem?id=3080 水题,暴搜 #include <iostream> #include<cstdio> #include< ...

  4. Bzoj 4408: [Fjoi 2016]神秘数 可持久化线段树,神题

    4408: [Fjoi 2016]神秘数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 177  Solved: 128[Submit][Status ...

  5. 【CF913F】Strongly Connected Tournament 概率神题

    [CF913F]Strongly Connected Tournament 题意:有n个人进行如下锦标赛: 1.所有人都和所有其他的人进行一场比赛,其中标号为i的人打赢标号为j的人(i<j)的概 ...

  6. [agc007f] Shik and Copying String 模拟神题

    Description ​ "全"在十分愉快打工,第0天,给了他一个仅有小写字母构成的长度为N的字符串S0,在之后的第i天里,"全"的工作是将Si−1复制一份到 ...

  7. AtCoder 神题汇总

    记录平时打 AtCoder 比赛时遇到的一些神题. Tenka1 Programmer Contest 2019 D Three Colors 题目大意 有 $n$ 个正整数 $a_1, a_2,\d ...

  8. hdoj5821【贪心-神题】

    啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊,比赛的时候直接读错题了,实力带坑队友.... 题意: 有两个序列都代表筐,每个筐里只有一个球,然后序列的值代表筐里的球的颜色,问你在m次操作后,a序列的球能否变成b ...

  9. [Bzoj4817] [Sdoi2017]树点涂色 (LCT神题)

    4817: [Sdoi2017]树点涂色 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 629  Solved: 371[Submit][Status ...

随机推荐

  1. sql排序 去除默认升降序排序case方法////遍历数据库所有表及统计表数据总数

    case排序法: end 还有EXEC法 可以网上查 SQLServer遍历数据库所有表及统计表数据总数: DECLARE @TableName varchar(); CREATE TABLE #Ge ...

  2. I'm Telling the Truth(二分图)

    .I'm Telling the Truth Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...

  3. 运行html,css,js好的软件

    WebStorm: http://pan.baidu.com/s/1eQF81Tw

  4. Selenium Grid 简易安装

    转载自:http://blog.csdn.net/xifeijian/article/details/17057659

  5. JMeter基于http请求的web接口性能测试总结

    [本文出自天外归云的博客园] 基于http请求的web接口性能测试总结 压测的目的:对于Web接口压测的目的最终是要在对数据库造成压力的情况下观察压测服务器的cpu是否达到预警值.memory是否发生 ...

  6. MySQL常用操作总结

    MySQL常用操作 前提条件:已安装MySQL. 学习目标:用一条sql语句写出A和B的剩余数量 AA表 BB表 以上为一道面试题,接下来由这道面试题来回顾一些数据库的基本操作. 登录MySQL su ...

  7. 2016 Al-Baath University Training Camp Contest-1 I

    Description It is raining again! Youssef really forgot that there is a chance of rain in March, so h ...

  8. Mysql-学习笔记(==》事件 十二)

    事件 计划任务(定期定时执行) -- 查看当前mysql数据库是否开启时间功能,默认关闭SHOW VARIABLES LIKE 'event_scheduler'; -- event_schedule ...

  9. javascript耐人寻味

    在思考javascript解释过程的时候,看过别人几篇文章,自己做了几个测试 容易理解,在javascript,形如这样的代码可以正常执行: alert(hello()); function hell ...

  10. 企业邮件服务器被列入RBL,申请撤销PBL指控

    1.登录[url]http://www.spamhaus.org/pbl/index.lasso[/url],在红框中输入企业电子邮件服务器MX记录地址: