有K个数D1~DK,一开始S0=0,每个人可以报一个数Si+1=Si-1+Dj或者Si+1=Si-Dj(1<=j<K),并且满足Si<=N及Si>Si-2,最先不能报数者输。
如果自己在某回合报的不是最小数,那么对方就可以减掉最小数使S变小,因为要满足条件自己又要加上一个比最小数大的数,对方又可以减掉最小数。。。这样每次使数变大的都是自己,必输。
所以最优策略就是一直报最小数。
1 #include <stdio.h> 2 #include <string.h> 3 #include <queue> 4 #define INF 0x3f3f3f3f 5 #define MAXN 335 6 int cas, n, m, x, minx; 7 int main(){ 8 //freopen("test.in", "r", stdin); 9 scanf("%d", &cas); 10 for (int ca = 1; ca <= cas; ca++) { 11 scanf("%d%d", &n, &m); 12 minx = INF; 13 for (int i = 0; i <m; i++) { 14 scanf("%d", &x); 15 minx = std::min(x, minx); 16 } 17 printf ("Case #%d: %s", ca, (n/minx)&1 ? "Bob\n":"Alice\n"); 18 } 19 return 0; 20 }