学习C++从娃娃抓起!记录下蓝桥杯备考比赛学习过程中的题目,记录每一个瞬间。
附上汇总贴:蓝桥杯备考冲刺必刷题(C++) | 汇总-CSDN博客
【题目描述】
Bob和Alice最近在学习博弈论, 为了学以致用, 他们找来了一大堆的小饼干, 并通过博弈的方式来吃掉这些小饼干。他们将找来的小饼干分成
n
n
n堆,每堆小饼干有
a
i
a_i
ai个小饼干。他们轮流对这些饼干进行操作,操作规则如下:
- 由Alice先手, 每次从一堆小饼干中拿出 k m k^m km个小饼干( k k k为奇数且 m ≥ 0 m\ge 0 m≥0,且 k m k^m km不能超出该堆小饼干的总数)。
- 当一方进行完操作后,如果已经没有剩余的小饼干,则该方获胜,赢得所有的小饼干。
Alice和Bob都想赢得所有的小饼干, 所以都会以最佳方法来取小饼干, 请问他们之中谁能赢得所有的小饼干?
【输入】
第一行,输入两个正整数
n
(
1
≤
n
≤
2
×
1
0
6
)
,
k
(
1
≤
k
≤
1
0
9
)
n(1\le n\le 2\times 10^6),k(1\le k\le 10^9)
n(1≤n≤2×106),k(1≤k≤109),分别表示饼干的堆数和每次取出饼干的底数。
第二行,输入
n
n
n个整数,表示第i堆小饼干有
a
i
(
1
≤
a
i
≤
1
0
6
)
a_i(1\le a_i\le 10^6)
ai(1≤ai≤106)个小饼干。
【输出】
输出一行,包含一个字符串,输出Alice和Bob之中获胜的那个人。
【输入样例】
2 3
4 1
【输出样例】
Alice
【代码详解】
#include <bits/stdc++.h>
using namespace std;
int n, k, ans;
int a[2000005];
int main()
{
cin >> n >> k;
for (int i=1; i<=n; i++) { // 输入n堆小饼干
cin >> a[i];
}
for (int i=1; i<=n; i++) { // 遍历n堆小饼干
if (a[i]%2==1) ans+=1; // 如果某个小饼干是奇数个,则需要奇数次才能取完,偶数个的花,需要偶数次才能取完
}
if (ans%2==1) { // 如果是取奇数次,Alice赢
cout << "Alice" << endl;
} else { // 如果是取偶数次,Bob赢
cout << "Bob" << endl;
}
return 0;
}
【运行结果】
2 3
4 1
Alice