UVA1500 Alice and Bob
Statement:
给
-
令 ,必须满足 。 -
,将 合并,必须满足
若一个人不能进行操作,则判他输。若两人都足够聪明,问谁会获胜。
Solution:
首先分析没有
加入
但是这个时候可以发现有一个特殊的数字会影响答案。就是
如果你对一个
于是我们发现有
观察到题目中
于是可以直接分类讨论转移。细节见下面代码:
Code:
#include<bits/stdc++.h> #define int long long using namespace std; const int N = 50 + 10, M = 1e3 + 10; int n, INF; int sg[N][M * N]; bool SG(int cnt, int sum){ // cout << cnt << " " << sum << "\n"; int& ans = sg[cnt][sum]; if(ans != INF) return ans; if(!cnt) return (ans = (sum & 1)); if(sum == 1) return (ans = SG(cnt + 1, 0)); // 1. mer(1, 1) 2.mer(2, 1) 3. mer(2, 2) 4. del(1) 5. del(2) ans = 1; if(cnt >= 2) ans &= SG(cnt - 2, sum + 2 + (sum ? 1 : 0)); if(sum && cnt) ans &= SG(cnt - 1, sum + 1); // if(sum >= 2) ans &= SG(cnt, sum - 1); if(cnt >= 1) ans &= SG(cnt - 1, sum); if(sum >= 1) ans &= SG(cnt, sum - 1); ans ^= 1; return ans; } signed main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int T; cin >> T; memset(sg, 0x3f, sizeof sg); INF = sg[0][0]; for(int t = 1; t <= T; t++){ cin >> n; int cnt = 0, sum = 0; for(int i = 1; i <= n; i++){ int a; cin >> a; if(a == 1) cnt++; else sum += a + 1; } if(sum) sum--; cout << "Case #" << t << ": " << (SG(cnt, sum) ? "Alice" : "Bob") << "\n"; } return 0; }
本文作者:Little_corn
本文链接:https://www.cnblogs.com/little-corn/p/18155057
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步