问题描述
Bob 和 Alice 最近在学习博弈论,为了学以致用,他们找来了一大堆的小饼干,并通过博弈的方式来吃掉这些小饼干。他们将找来的小饼干分成 nn 堆,每堆小饼干有 aiai 个小饼干。他们轮流对这些饼干进行操作,操作规则如下:
- 由 Alice 先手,每次从一堆小饼干中拿出 kmkm 个小饼干( kk 为奇数且 m≥0m≥0,且 kmkm 不能超出该堆小饼干的总数)。
- 当一方进行完操作后,如果已经没有剩余的小饼干,则该方获胜,赢得所有的小饼干。
Alice 和 Bob 都想赢得所有的小饼干,所以都会以最佳方法来取小饼干,请问他们之中谁能赢得所有的小饼干?
输入格式
第一行,输入两个正整数 nn (1≤n≤2×106)(1≤n≤2×106) , kk (1≤k≤109)(1≤k≤109) ,分别表示饼干的堆数和每次取出饼干的底数。
第二行,输入 nn 个整数,表示第 ii 堆小饼干有 aiai(1≤ai≤1061≤ai≤106) 个小饼干。
输出格式
输出一行,包含一个字符串,输出 Alice 和 Bob 之中获胜的那个人。
样例输入 1
2 3
4 1
样例输出 1
Alice
样例输入 2
2 1
6 6
样例输出 2
Bob
样例说明
在第一个样例中,Alice 拿走第一堆饼干中的 33 (k1)(k1) 个饼干,此时剩余的饼干数分别为 [1,1][1,1] ,此时,Bob 无论拿哪堆饼干都会使得剩下那堆饼干只有一个,Alice 只需要在下一轮拿走剩余的饼干即可获胜。
在第二个样例中,由于每次都只能取一个,且有 1212 个饼干,所以先手的人到最后一定会输掉比赛。
运行限制
语言 | 最大运行时间 | 最大运行内存 |
---|---|---|
C++ | 1s | 256M |
C | 1s | 256M |
Java | 2s | 256M |
Python3 | 3s | 256M |
自己的循环解法
#include <stdio.h>
#include <stdlib.h>
//突然想到,解决办法了
//拿走次数为奇数,是A
//拿走次数为偶数,是B
int main(int argc, char *argv[])
{
// 请在此输入您的代码
int n = 0,k = 0,m = 0;
int t = k^m;
int a[1000001] = {0};
int count = 0;
scanf("%d %d\n",&n,&k);
for(int i = 1;i <= n; i++)
scanf("%d ",&a[i]);
for(int i = 1;i <= n; i++)
{
for(int m = 1;m <= a[i]; m++)
{
if(t <= a[i])
{
a[i] = a[i] - t;
count++;
}
}
}
if(count %2 ==0)
printf("Bob");
else
printf("Alice");
return 0;
}
递归法(这个测试有问题,不要用!!!我是方便自己才挂的)
#include <stdio.h>
int canWin(int n, int k, int cookies[], int visited[]) {
int canMove = 0;
for (int i = 0; i < n; i++) {
if (cookies[i] > 0) {
canMove = 1;
break;
}
}
if (!canMove) {
return -1;
}
for (int i = 0; i < n; i++) {
if (cookies[i] > 0 && cookies[i] <= k && cookies[i] % 2 != 0) {
return 1;
}
}
for (int i = 0; i < n; i++) {
if (cookies[i] > 0) {
for (int j = 1; j <= cookies[i] && j <= k; j++) {
cookies[i] -= j;
if (!visited[i] && canWin(n, k, cookies, visited) == -1) {
cookies[i] += j;
return 1;
}
cookies[i] += j;
}
}
}
return -1;
}
int main() {
int n, k;
scanf("%d %d", &n, &k);
int cookies[n];
int visited[n];
for (int i = 0; i < n; i++) {
scanf("%d", &cookies[i]);
visited[i] = 0;
}
int result = canWin(n, k, cookies, visited);
if (result == 1) {
printf("Alice\n");
} else {
printf("Bob\n");
}
return 0;
}