POJ 2484 A Funny Game(神题!)
一开始看这道博弈题的时候我就用很常规的思路去分析了,首先先手取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(神题!)的更多相关文章
- poj 1011 Sticks ,剪枝神题
木棒 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 118943 Accepted: 27429 Description 乔治拿 ...
- BUAA 724 晴天小猪的神题(RMQ线段树)
BUAA 724 晴天小猪的神题 题意:中文题,略 题目链接:http://acm.buaa.edu.cn/problem/724/ 思路:对于询问x,y是否在同一区间,可以转换成有没有存在一个区间它 ...
- poj 3080 Blue Jeans(水题 暴搜)
题目:http://poj.org/problem?id=3080 水题,暴搜 #include <iostream> #include<cstdio> #include< ...
- Bzoj 4408: [Fjoi 2016]神秘数 可持久化线段树,神题
4408: [Fjoi 2016]神秘数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 177 Solved: 128[Submit][Status ...
- 【CF913F】Strongly Connected Tournament 概率神题
[CF913F]Strongly Connected Tournament 题意:有n个人进行如下锦标赛: 1.所有人都和所有其他的人进行一场比赛,其中标号为i的人打赢标号为j的人(i<j)的概 ...
- [agc007f] Shik and Copying String 模拟神题
Description "全"在十分愉快打工,第0天,给了他一个仅有小写字母构成的长度为N的字符串S0,在之后的第i天里,"全"的工作是将Si−1复制一份到 ...
- AtCoder 神题汇总
记录平时打 AtCoder 比赛时遇到的一些神题. Tenka1 Programmer Contest 2019 D Three Colors 题目大意 有 $n$ 个正整数 $a_1, a_2,\d ...
- hdoj5821【贪心-神题】
啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊,比赛的时候直接读错题了,实力带坑队友.... 题意: 有两个序列都代表筐,每个筐里只有一个球,然后序列的值代表筐里的球的颜色,问你在m次操作后,a序列的球能否变成b ...
- [Bzoj4817] [Sdoi2017]树点涂色 (LCT神题)
4817: [Sdoi2017]树点涂色 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 629 Solved: 371[Submit][Status ...
随机推荐
- ScheduledExecutorService定时周期执行指定的任务
示例代码 package com.effective.common.concurrent.execute; import java.text.DateFormat; import java.text. ...
- tomcat部署到根路径
在Tomcat中部署war包很简单: 首先,直接把相应的war包放到$TOMCAT_HOME/webapps下,不用建目录: 然后,修改$TOMCAT_HOME/conf/server.xml,在Ho ...
- hdu1074 Doing Homework
这题比较有意思,暴力搜索必然tle,可以用状态压缩dp解决. 我们先不考虑完成所有作业的扣分,而考虑其一个子集的情况. 假设我们得到了完成某子集S对应的作业最少扣分,我们试着向该子集中增加一个元素a, ...
- 2016年10月15日 星期六 --出埃及记 Exodus 18:26
2016年10月15日 星期六 --出埃及记 Exodus 18:26 They served as judges for the people at all times. The difficult ...
- 使用 JavaScript
我们要用 JavaScript,但是把它写在哪里呢? 这里 ↘ 1. HTML 页面中 . 2. 单独的一个文件中,文件后缀名是“.js”. ——————————————————— ...
- CSocket客户端(TCP)
首先是UDP和TCP的区别: UDP是不连接服务器,每次发送数据的时候需要服务器的IP:而TCP是先连接服务器,保持常连接,然后直接发送不需要IP. 下面是TCP客户端: 1.新建项目,TestCSo ...
- oracle数据库导入导出dmp文件oracle命令
在控制台下导入imp scott/密码@orcl file=文件路径 full=Y 导出 整个数据库TEST 用户名system 密码1234 exp system/1234@TEST file=文 ...
- 【leetcode❤python】206. Reverse Linked List
# Definition for singly-linked list.# class ListNode(object):# def __init__(self, x):# s ...
- BZOJ 1835 基站选址(线段树优化DP)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1835 题意:有N个村庄坐落在一条直线上,第 i(i>1)个村庄距离第1个村庄的距离 ...
- Mysql错误问题记录
① Incorrect string value: '\xE6\x94\xBE\xE5\xA4\xA7...' for column 'name' at row 1 Query…… 原因:编码不匹配. ...