蓝桥杯备考冲刺必刷题(C++) | 3865 Alice和Bob的爱恨情仇

学习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 m0,且 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(1n2×106),k(1k109),分别表示饼干的堆数和每次取出饼干的底数。
第二行,输入 n n n个整数,表示第i堆小饼干有 a i ( 1 ≤ a i ≤ 1 0 6 ) a_i(1\le a_i\le 10^6) ai(1ai106)个小饼干。
【输出】
输出一行,包含一个字符串,输出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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值