
博弈
嘎达啊
无名小卒
展开
-
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 #include using原创 2013-05-03 14:46:11 · 459 阅读 · 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 · 602 阅读 · 0 评论 -
hdu1851
是 尼姆+巴什博弈; 主要看最后余下的每堆的数量在异或; 如果最后的异或是先手胜;必胜策略: 假设一堆有 a个石头, 最多拿走b个 先手拿走k个 后手拿走m个 先手在拿走 b+1-m个,。。。 最后先手要剩下 a%(b+1); 每一堆都这样处理; 如果后手必胜的话 先手拿走k个 后手拿走b+1-k个 最后异或; #include #include using namespace原创 2013-05-14 15:52:01 · 452 阅读 · 0 评论 -
hau2188
尼姆博弈: 1:如果n <= m 先手必胜; 2:如果n > m; n = (m+1)*r 先手必输,策略: 先手拿走k个 则后手拿走m+1-k个 最后由后手拿完; 3:如果 n = (m+1)*r+g 先手必胜,因为先手拿走 g个,又回到上面2的情况; #include using namespace std; int main() { int t; cin >> t;原创 2013-05-10 20:43:12 · 478 阅读 · 0 评论 -
SG
#include #include #include #include using 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 · 885 阅读 · 0 评论 -
hdu3951
1:如果 k = 1, n为奇数,则 先手必胜; 2:如果 k > 1, k >= n, 先手必胜; 否则 必然会断链,后手只要取完或者将其分成两分并按照先手的方法走,后手必胜; #include using namespace std; int main() { int n, t; cin >> t; int k = 0; while(t--)原创 2013-05-10 20:26:20 · 580 阅读 · 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 · 550 阅读 · 0 评论 -
hdu2516
2 必输点, 3 必输, 4 必胜 先手拿走一个,得3 必输,后手不管是拿走2 或1个, 5 必输, 6 必胜 先手拿走一个 得5 后手必输, 所以 fibonacci 数 必输; #include using namespace std; int main() { int a[100]; a[1] = 2; a[2] = 3; for(int i = 3;原创 2013-05-10 14:41:34 · 475 阅读 · 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 · 697 阅读 · 0 评论 -
hdu1730
这道题其实就是尼姆博弈的变形,只不过是石头堆变成了两个点的距离 因为他们都是按最好的决策进行的 所以他们都会尽量往对方靠近 以使对方 没法移动 从而控制对方; 再对比尼姆博弈的石头堆 只要是将所有的石头堆进行异或 如果结果是 0 则先手必输;反之则胜;同理如果 他们的距离取异或 如果为0 先手即 黑子必输; #include #include using namespace std; in原创 2013-05-03 16:07:26 · 557 阅读 · 0 评论 -
hdu1525
如果a/b ==1 的话 必输,如 (7 4) 必有(4 3)(3 1)(1 0) 如果a/b >= 2 的话必赢 因为他可以到达a/b = 1; #include using namespace std; int main() { int a, b; while(cin >> a >> b&&a&&b) { int k = 0;原创 2013-05-02 17:44:35 · 573 阅读 · 0 评论