hdu5591 ZYB's Game
2015-12-07 09:36
162 查看
博弈,当N为偶数时,先手必赢,输出0,当N为奇数时,后手必赢且只有最中间的那个位置为炸弹时才能赢,输出1
不论是奇数还是偶数,炸弹在1和N这两个地方,后手必输,因为先手在炸弹在1的时候选2,在炸弹在N的时候选N - 1,则后手只能选炸弹。
对于其他情况则只需考虑2到N / 2(向上取整),因为左右的情况是对称的。
红色为炸弹,褐色为先手,绿色为后手
如果为偶数
如图,炸弹在3,先手只要选6,也就是留一个以3为对称点的区间给后手
然后若后手选1,先手要一直选1以3为对称点的那个位置,此时为5
然后一直照着选后手选的那个点关于炸弹对称点的策略,最后一定是后手先选到炸弹
也就是说要给后手一直留一个如图[1, 5]的对称区间的陷阱,这个陷阱的长度易知一定为奇数,因为是对称的,炸弹换到其他地方同理可得
当N为偶数的时候后手在第一步的时候总能给后手构造这么个区间,也就是以N为偶数的时候后手必输
所以合适的炸弹位置为0
同样的,N为奇数时也只需要考虑半个区间就行了,如炸弹在3这种情况,采取和上面一样的策略,先手选6,给后手留[1, 5]对称区间,则由上面知道后手必输,
炸弹在2的时候也一样
只有当炸弹在4的时候
先手第一步让自己入陷阱了,而且没有别的选择,这时后手只要反客为主选与7以4位对称点的那个位置,一直这种策略选下去,则后手必赢
发现只有炸弹在4这个对称中心的时候后手才能赢,因此N为奇数的时候输出1
综上:N为偶数的时候输出0,N为奇数的时候输出1
不论是奇数还是偶数,炸弹在1和N这两个地方,后手必输,因为先手在炸弹在1的时候选2,在炸弹在N的时候选N - 1,则后手只能选炸弹。
对于其他情况则只需考虑2到N / 2(向上取整),因为左右的情况是对称的。
红色为炸弹,褐色为先手,绿色为后手
如果为偶数
如图,炸弹在3,先手只要选6,也就是留一个以3为对称点的区间给后手
然后若后手选1,先手要一直选1以3为对称点的那个位置,此时为5
然后一直照着选后手选的那个点关于炸弹对称点的策略,最后一定是后手先选到炸弹
也就是说要给后手一直留一个如图[1, 5]的对称区间的陷阱,这个陷阱的长度易知一定为奇数,因为是对称的,炸弹换到其他地方同理可得
当N为偶数的时候后手在第一步的时候总能给后手构造这么个区间,也就是以N为偶数的时候后手必输
所以合适的炸弹位置为0
同样的,N为奇数时也只需要考虑半个区间就行了,如炸弹在3这种情况,采取和上面一样的策略,先手选6,给后手留[1, 5]对称区间,则由上面知道后手必输,
炸弹在2的时候也一样
只有当炸弹在4的时候
先手第一步让自己入陷阱了,而且没有别的选择,这时后手只要反客为主选与7以4位对称点的那个位置,一直这种策略选下去,则后手必赢
发现只有炸弹在4这个对称中心的时候后手才能赢,因此N为奇数的时候输出1
综上:N为偶数的时候输出0,N为奇数的时候输出1
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <cstdlib> using namespace std; int main() { int T, n; cin >> T; while (T--) { scanf("%d", &n); if (n % 2 != 0) { printf("1\n"); } else { printf("0\n"); } } return 0; }
相关文章推荐
- Linux内核模块简介
- hashcat
- 应试教育堵死了孩子们犯错的道路
- lua中的require函数
- The Fallacy of Perfect Execution
- LeetCode 206 Reverse Linked List
- IOS开发之启动画面延时
- CSS常用选择器名
- js将数字转成大写中文
- 【转】深入浅出:Linux设备驱动之字符设备驱动
- [通达信公式] 爵府6号源码
- Planning for Reality
- Greenplum的安装
- android layout-weight属性
- Redis主从配置
- 绝对定位与相对定位
- 乘除:
- GSM cell phone calls use outdated encryption that can now be cracked with rainbow tables on a PC
- IT Program Management: Shared Vision
- Centos 操作指令-2