博弈
嘎达啊
无名小卒
展开
-
hdu1527
这是到威佐福博弈,主要是找奇异局势即是必败局势;如(0 0)(1 2)(3 5)(4 7)(6 10)(8 13)(9 15)(11 18);有公式判断奇异局势 ak = [k(1+sqrt(5.0))*0.5];bk = ak + k;当 a == [(b-a)*(1+sqrt(5.0))*0.5] ([]是取整, b > a);#include#includeusing原创 2013-05-03 14:46:11 · 443 阅读 · 0 评论 -
hdu1517
这题主要找必胜段 和 必输段 从后往前找规律,如 1000;100| 99 12| 11 6| 5 1|这里的必输段是|99 12| |5 1|你在这些段里 对手无论用 2--9 中的什么数都可以到必胜段其他的为必胜段;主要让对手到必输段,假如对手在|99 12|段 你怎样让对手进入这个段?就是下一个段中无论对手去什么值 都可以进入这个段 所以 12除以2 就是 即|11原创 2013-05-02 14:20:17 · 591 阅读 · 0 评论 -
hdu1851
是 尼姆+巴什博弈;主要看最后余下的每堆的数量在异或;如果最后的异或是先手胜;必胜策略:假设一堆有 a个石头, 最多拿走b个 先手拿走k个 后手拿走m个 先手在拿走 b+1-m个,。。。最后先手要剩下 a%(b+1);每一堆都这样处理;如果后手必胜的话 先手拿走k个 后手拿走b+1-k个 最后异或;#include#includeusing namespace原创 2013-05-14 15:52:01 · 448 阅读 · 0 评论 -
hau2188
尼姆博弈:1:如果n <= m 先手必胜;2:如果n > m; n = (m+1)*r 先手必输,策略:先手拿走k个 则后手拿走m+1-k个 最后由后手拿完;3:如果 n = (m+1)*r+g 先手必胜,因为先手拿走 g个,又回到上面2的情况;#includeusing namespace std;int main(){ int t; cin >> t;原创 2013-05-10 20:43:12 · 468 阅读 · 0 评论 -
SG
#include#include#include#includeusing namespace std;int f[10001], fibo[100], k;int mex1(int p){ int i, t; bool g[101] = {0}; for(i = 0; i < k; i++) { t = p - fibo[i];原创 2013-05-10 18:39:33 · 813 阅读 · 0 评论 -
hdu3951
1:如果 k = 1, n为奇数,则 先手必胜;2:如果 k > 1, k >= n, 先手必胜;否则 必然会断链,后手只要取完或者将其分成两分并按照先手的方法走,后手必胜;#includeusing namespace std;int main(){ int n, t; cin >> t; int k = 0; while(t--)原创 2013-05-10 20:26:20 · 564 阅读 · 0 评论 -
hdu2897
巴什博弈,规定 先走为 f, 后走为s;1:如果 n = (p+q)*r; f必胜;f拿走q个 假设s拿走k个 则 f 再拿走q+p-k个 这样就如有个循环; 最后还剩下1--p个s必输;2:如果 n = (p+q)*r + g (0<g<=p); s必胜;假设f拿走k个。s只需拿走p+q-k个最后剩下个 g个 只有f来拿;3:如果 n = (p+q)*r +g (p<g<=q+原创 2013-05-10 16:34:25 · 535 阅读 · 0 评论 -
hdu2516
2 必输点,3 必输,4 必胜 先手拿走一个,得3 必输,后手不管是拿走2 或1个,5 必输,6 必胜 先手拿走一个 得5 后手必输,所以 fibonacci 数 必输; #includeusing namespace std;int main(){ int a[100]; a[1] = 2; a[2] = 3; for(int i = 3;原创 2013-05-10 14:41:34 · 466 阅读 · 0 评论 -
hdu1850
先判断是否是必胜,即将所有的状态进行异或 如果不等于0 就是先手必输 反之先手必胜;这道题的数据都是先手必胜,只计算先手从必胜态操作到必输态,如果(a1,a2, a3, a4 .......) 这些取异或 a1^a2^a3^a4....=k(k!=0)则先手必胜,先手必可以通过改变某堆 的数量 使ai 为ai‘ 则a1 ^a2^a3^a4^...^ai' = 0;如何求取某一堆取多少时原创 2013-05-07 17:02:26 · 690 阅读 · 0 评论 -
hdu1730
这道题其实就是尼姆博弈的变形,只不过是石头堆变成了两个点的距离因为他们都是按最好的决策进行的 所以他们都会尽量往对方靠近 以使对方没法移动 从而控制对方;再对比尼姆博弈的石头堆 只要是将所有的石头堆进行异或 如果结果是0 则先手必输;反之则胜;同理如果 他们的距离取异或 如果为0 先手即黑子必输;#include#includeusing namespace std;in原创 2013-05-03 16:07:26 · 545 阅读 · 0 评论 -
hdu1525
如果a/b ==1 的话 必输,如 (7 4) 必有(4 3)(3 1)(1 0)如果a/b >= 2 的话必赢 因为他可以到达a/b = 1;#includeusing namespace std;int main(){ int a, b; while(cin >> a >> b&&a&&b) { int k = 0;原创 2013-05-02 17:44:35 · 555 阅读 · 0 评论