[51nod1430]奇偶游戏
来源:互联网 发布:mac制作ubuntu安装u盘 编辑:程序博客网 时间:2024/06/15 01:02
Description
D和S(名字太长不想写)在玩一个游戏。
有n个数,每一次操作者可以选择一个数删去,直到剩下k个数为止。
如果这k个数的和为奇数则S胜,否则D胜。
S先手,求先手是否有必胜策略。
n<=1e6
Solution
显然结论题,然而结论好烧脑啊!!!(人体自燃)
或者是我的思路有点乱的关系,将就着看一下就好了。。。
既然最后要分析奇偶性,那么我们把奇数和偶数分开来讨论。。。
设odd表示有多少个奇数,even表示有多少个偶数。
d表示D能删去多少个数,s表示S能删去多少个数。(d<=s<=d+1)
然后S胜利的条件就是最后odd为奇数。
那么我们显然更容易判断如何让D胜利。
首先如果d>=odd,那么无论如何D都可以把所有的奇数拿掉,让自己胜利,所以D必胜。
如果s>=odd,那么S显然不会吧所有奇数拿掉,暂时不用管。
然后另一个显然的结论是,如果双方谁都不能把odd或even拿掉,那么如果s>d S胜否则D胜。因为后手可以根据先手所做的来掌控这一轮对奇偶性的影响。
否则,如果D把所有偶数拿完之后剩下偶数个odd那么D必胜,否则S必胜。
因为d也不会把所有even拿掉,那么就可以用上面说的调整来做了。
注意特判n=k的情况
Code
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)using namespace std;int n,k,x,odd,even,D,S;void win() { printf("Daenerys\n");exit(0);}void lose() { printf("Stannis\n");exit(0);}int get() { char ch;while (!isdigit(ch=getchar())); int o=ch-48;while (isdigit(ch=getchar())) o=o*10+ch-48; return o;}int main() { n=get();k=get(); fo(i,1,n) { x=get(); if (x&1) odd++;else even++; } if (k==n) { if (odd&1) lose(); else win(); } k=n-k;int D=S=k/2; if (k&1) S++; if (D>=odd) win(); if (D<S&&D>=even&&(n&1)) win(); else if (D<S&&D>=even&&!(n&1)) lose(); if (D==S&&D>=even&&!(n&1)) win(); else if (D==S&&D>=even&&(n&1)) lose(); if (D==S) win();else lose();}
0 0
- [51nod1430]奇偶游戏
- [51nod 1430]奇偶游戏
- 51Nod-1430-奇偶游戏
- 51nod 1430:奇偶游戏 博弈
- 51 Nod 1430 奇偶游戏(博弈)
- codevs 2546奇偶游戏
- CODEVS 2456 奇偶游戏
- 【并查集】奇偶游戏
- 51Nod-1617-奇偶数组
- 51nod1617(codeforces117D)奇偶数组
- 51nod 1617 奇偶数组 分治
- 51页19题 判断一个正整数是否奇偶交替
- 奇偶排序
- 奇偶剪枝
- 分奇偶
- 奇偶校验码
- 奇偶剪枝
- 奇偶校验码
- POJ 3268 Silver Cow Party 笔记
- 并查集 CD收藏 sdnu
- SecureCRT按Ctrl+S后假死问题
- 机器学习第二课:无约束优化问题(局部极小值的几种解法)(梯度下降法与拟牛顿法)
- 快速排序
- [51nod1430]奇偶游戏
- android适配器之基于BaseAdapt自定义简单适配器
- android wifi连接打印机并获取打印机状态
- acm笨小熊
- React
- 字符串的处理(大写换成小写)
- android集成微信分享
- OpenCV 图像清晰度评价(相机自动对焦)
- PAT 1005. 继续(3n+1)猜想 (25)