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 ...
随机推荐
- 关于plsql表如何创建自增长列
1首先在sequence中创建新序列 在oracle中sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方. 这是语句创建 create sequence ide ...
- MultiSelectComboBox(一)
1. MultiSelectComboBox.xaml <UserControl x:Class="MultiSelectComboBox.MultiSelectComboBox&qu ...
- 测试post
http://www.atool.org/httptest.php 这里也可以测试 火狐有插件:HttpRequester Chrome有插件:Postman
- Json 入门例子【2】
<script> var json1 = { "id": 1, "tagName": "apple" }; $("#f ...
- 查看C语言的方法名
1,打开 Visual Studio 2008 x64 Win64 命令提示 2,查看dumpbin –exports [C动态库的路径]
- KDTree
学习链接:http://www.cnblogs.com/eyeszjwang/articles/2429382.html 下面实现的kdtree支持以下操作:(1) 插入一个节点(2) 插入n个节点( ...
- DIV的表单布局
表单布局其实用表格最好了,可是表格的话,无法定位,这个是一个硬伤. <!DOCTYPE html> <html> <head> <meta charset=& ...
- jquery之 css()方法。用法类似的有attr(),prop(),val()
[注]attr(),prop(),val()的用法结构和css()一致,可参考 css()函数用于设置或返回当前jQuery对象所匹配的元素的css样式属性值. 该函数属于jQuery对象(实例).如 ...
- [UVa1210]Sum of Consecutive Prime Numbers(前缀和,打表)
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- mimikatz2.0抓取WINDOWS密码
看吾爱的,刚好问同事说这个也用过,以后内网渗透的话比较方便 http://www.52pojie.cn/thread-264895-1-1.html ========================= ...