标签:second not eps lowbit event return play hdu most
InputThe first line contains an integer T(1 <= T <= 4000), indicating the number of test cases.
Each test case contains several lines.
The first line contains an integer N(1 <= N <= 50).
The next line contains N positive integers A 1 ....A N(1 <= A i <= 1000), represents the numbers they write down at the beginning of the game.OutputFor each test case in the input, print one line: "Case #X: Y", where X is the test case number (starting with 1) and Y is either "Alice" or "Bob".
Sample Input
3 3 1 1 2 2 3 4 3 2 3 5
Sample Output
Case #1: Alice Case #2: Bob Case #3: Bob
给出 n 个数,每次有两种操作
1、任意取一个数字,让他减一
2、把两个数字合并起来
最后不能操作的人失败
考虑全部不合并和全部合并的情况,操作次数的范围是[∑a, ∑a + n - 1]。
如果每一堆石子全部大于1, ∑a + n - 1 就是先手能否赢。 因为如果这是一个奇数,后手想赢必须让其中一堆没有参与到合并,那么后手一定要让这一堆进行操作1,由于全部大于1,那么不可能一步完成,先手只要每次把这堆合并起来就一定能赢。
反之同理,偶数时后手用同样的方法限制先手,后手一定能赢。
那么考虑有 1 的时候,如果这时候一方想要减少合并次数,只需要把 1 进行操作1,另一方无法阻止。则把 1 单独拿出来。
用 sg[i][j] 表示有 i 个 1 ,除了 1 以外剩余堆可以进行的最多的操作次数。然后开始操作
(1)、在 i 里面进行操作1
(2)、在 j 里面进行操作1
(3)、让 i 和 j 进行操作2
(4)、让 i 和 i 进行操作2
然后进行转移就可以了
然后其中的细节差不多有如下
1、当 i == 0时,j 的奇偶进就决定了能否赢
2、在(2)中,如果 j==2,会转化一个到 i,自己变成0,变成sg[i+1][0]; 如果j>2,正常转化,sg[i+1][j-1];
3、在(4)中,如果 j==0,转化出来为sg[i-2][2]; 如果 j>0,那么合并出来的新堆可以之前的 j 在合并一次,所以是sg[i-2][j+3]
/* . ‘;;;;;. ‘!;;;;;;!;` ‘!;|&#@|;;;;!: `;;!&####@|;;;;!: .;;;!&@$$%|!;;;;;;!‘.`:::::‘. ‘!;;;;;;;;!$@###&|;;|%!;!$|;;;;|&&;. :!;;;;!$@&%|;;;;;;;;;|!::!!:::;!$%;!$%` ‘!%&#########@$!:. ;!;;!!;;;;;|$$&@##$;;;::‘‘‘‘‘::;;;;|&|%@$|;;;;;;;;;;;;;;;;!$; ;|;;;;;;;;;;;;;;;;;;!%@#####&!:::;!;;;;;;;;;;!&####@%!;;;;$%` `!!;;;;;;;;;;!|%%|!!;::;;|@##%|$|;;;;;;;;;;;;!|%$#####%;;;%&; :@###&!:;;!!||%%%%%|!;;;;;||;;;;||!$&&@@%;;;;;;;|$$##$;;;%@| ;|::;;;;;;;;;;;;|&&$|;;!$@&$!;;;;!;;;;;;;;;;;;;;;;!%|;;;%@%. `!!;;;;;;;!!!!;;;;;$@@@&&&&&@$!;!%|;;;;!||!;;;;;!|%%%!;;%@|. %&&$!;;;;;!;;;;;;;;;;;|$&&&&&&&&&@@%!%%;!||!;;;;;;;;;;;;;$##! !%;;;;;;!%!:;;;;;;;;;;!$&&&&&&&&&&@##&%|||;;;!!||!;;;;;;;$&: ‘:|@###%;:;;;;;;;;;;;;!%$&&&&&&@@$!;;;;;;;!!!;;;;;%&!;;|&%. !@|;;;;;;;;;;;;;;;;;;|%|$&&$%&&|;;;;;;;;;;;;!;;;;;!&@@&‘ .:%#&!;;;;;;;;;;;;;;!%|$$%%&@%;;;;;;;;;;;;;;;;;;;!&@: .%$;;;;;;;;;;;;;;;;;;|$$$$@&|;;;;;;;;;;;;;;;;;;;;%@%. !&!;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;|@#; `%$!;;;;;;;;;;;$@|;;;;;;;;;;;;;;;;;;;;;;;;!%$@#@|. .|@%!;;;;;;;;;!$&%||;;;;;;;;;;;;;;;;;!%$$$$$@#|. ;&$!;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;%#####|. |##$|!;;;;;;::‘‘:;;;;;;;;;;;;;!%$$$@#@; ;@&|;;;;;;;::‘‘‘‘‘‘:;;;;;;;|$&@###@|` .%##@|;;;;:::‘‘‘‘‘‘‘‘‘‘::;!%&##$‘ `$##@$$@@&|!!;;;:‘‘‘‘‘::::;;;;;|&#%. ;&@##&$%!;;;;;;::‘‘‘‘‘‘‘‘::;!|%$@#@&@@: .%@&$$|;;;;;;;;;;:‘‘‘‘:‘‘‘‘::;;;%@#@@#%. :@##@###@$$$$$|;;:‘‘‘‘:;;!!;;;;;;!$#@@#$;` `%@$$|;;;;;;;;:‘‘‘‘‘‘‘::;;;;|%$$|!!&###&‘ |##&%!;;;;;::‘‘‘‘‘‘‘‘‘‘‘‘::;;;;;;;!$@&:`!‘ :;!@$|;;;;;;;::‘‘‘‘‘‘‘‘‘‘‘:;;;;;;;;!%&@$: !@#$‘ |##@@&%;;;;;::‘‘‘‘‘‘‘‘‘:;;;;;;;!%&@#@$%: ‘%%!%&; |&%!;;;;;;;%$!:‘‘‘‘‘‘‘:|%!;;;;;;;;|&@%||` ‘%$|!%&; |@%!;;!!;;;||;:‘‘‘‘‘‘:;%$!;;;;!%%%&#&%$&: .|%;:!&%` !@&%;;;;;;;||;;;:‘‘::;;%$!;;;;;;;|&@%;!$; `%&%!!$&: ‘$$|;!!!!;;||;;;;;;;;;;%%;;;;;;;|@@|!$##; !$!;:!$&: |#&|;;;;;;!||;;;;;;;;!%|;;;;!$##$;;;;|%‘ `%$|%%;|&$‘ |&%!;;;;;;|%;;;;;;;;$$;;;;;;|&&|!|%&&; .:%&$!;;;:!$@! `%#&%!!;;;;||;;;;;!$&|;;;!%%%@&!;;;!!;;;|%!;;%@$!%@! !&!;;;;;;;;;||;;%&!;;;;;;;;;%@&!;;!&$;;;|&%;;;%@%` ‘%|;;;;;;;;!!|$|%&%;;;;;;;;;;|&#&|!!||!!|%$@@|‘ .!%%&%‘`|$; :|$#%|@#&;%#%. */ #include <map> #include <set> #include <list> #include <ctime> #include <cmath> #include <stack> #include <queue> #include <cfloat> #include <string> #include <vector> #include <cstdio> #include <bitset> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #define lowbit(x) x & (-x) #define mes(a, b) memset(a, b, sizeof a) #define fi first #define se second #define pii pair<int, int> #define INOPEN freopen("in.txt", "r", stdin) #define OUTOPEN freopen("out.txt", "w", stdout) typedef unsigned long long int ull; typedef long long int ll; const int maxn = 5e4 + 50; const int maxm = 1e5 + 10; const ll mod = 1e9 + 7; const ll INF = 1e18 + 100; const int inf = 0x3f3f3f3f; const double pi = acos(-1.0); const double eps = 1e-8; using namespace std; int n, m; int cas, tol, T; int sg[55][maxn]; void dfs(int x, int y) { if(sg[x][y] != -1) return ; if(x == 0) { sg[x][y] = y&1; return ; } if(x) { dfs(x-1, y); if(sg[x-1][y] == 0) { sg[x][y] = 1; return ; } } if(y) { dfs(x-1, y+1); if(sg[x-1][y+1] == 0) { sg[x][y] = 1; return ; } } if(x > 1) { if(y) { dfs(x-2, y+3); if(sg[x-2][y+3] == 0) { sg[x][y] = 1; return ; } } else { dfs(x-2, 2); if(sg[x-2][2] == 0) { sg[x][y] = 1; return ; } } } if(y > 1) { if(y > 2) { dfs(x, y-1); if(sg[x][y-1] == 0) { sg[x][y] = 1; return ; } } else { dfs(x+1, 0); if(sg[x+1][0] == 0) { sg[x][y] = 1; return ; } } } sg[x][y] = 0; return ; } int main() { mes(sg, -1); sg[0][0] = 0; cas = 1; scanf("%d", &T); while(T--) { int ans = 0, cnt = 0; scanf("%d", &n); for(int i=1, x; i<=n; i++) { scanf("%d", &x); if(x > 1) ans += x+1; else cnt++; } if(ans) ans--; if(sg[cnt][ans] == -1) dfs(cnt, ans); printf("Case #%d: %s\n", cas++, sg[cnt][ans] ? "Alice" : "Bob"); } return 0; }
Alice and Bob HDU - 4111 (SG函数)
标签:second not eps lowbit event return play hdu most
原文地址:https://www.cnblogs.com/H-Riven/p/10352275.html