c++取火柴游戏

取火柴游戏

描述

输入 k 及 k 个整数 n 1 ,n 2 ,…,n k ,表示有 k 堆火柴棒,第 i 堆火柴棒的根数为 n i 。接着便是和计算机对弈游戏,取火柴的规则如下:每次可以从一堆中取走若干根火柴,也可以将一堆全部取走,但不允许跨堆取,也不允许不取。

谁取走最后一根火柴算谁胜利。

例如,k=2,n 1 =n 2 =2,A 代表你,P 代表计算机,若决定 A 先取:

A: (2,2)→(1,2)  // 从一堆中取一根

P: (1,2)→(1,1)  // 从另一堆中取一根

A: (1,1)→(1,0)

P: (1,0)→(0,0)  //P 胜利

如果决定 A 后取:

P: (2,2)→(2,0)

A: (2,0)→(0,0)  //A 胜利

又如 k=3,n 1 =1,n 2 =2,n 3 =3,A 决定后取:

P: (1,2,3)→(0,2,3)

A: (0,2,3)→(0,2,2)

A 已将游戏归结为(2,2)的情况,不管 P 如何取 A 都必胜。

输入

第一行一个整数k。

第二行k个正整数,表示有 k 堆火柴棒,第 i 堆火柴棒的根数为 ni​

输出

如果是先取必胜,请在第一行输出两个整数a,b,表示第一次从第b堆取出a个。第二行为第一次取火柴后的状态。如果有多种答案,则输出<b,a>字典序最小的答案(即b最小的前提下a最小)。

如果是先取必败,则输出“lose”。

输入样例 1 

3
3 6 9

输出样例 1

4 3 
3 6 5 

输入样例 2 

4
15 22 19 10

输出样例 2

lose
#include <iostream>
#include <vector>

using namespace std;

int main() {
    int k;
    cin >> k;
    vector<int> piles(k);
    int xor_sum = 0;
    for (int i = 0; i < k; ++i) {
        cin >> piles[i];
        xor_sum ^= piles[i];
    }
    if (xor_sum == 0) {
        cout << "lose" << endl;
    } else {
        for (int i = 0; i < k; ++i) {
            int temp = xor_sum ^ piles[i]; 
            if (temp < piles[i]) { 
                cout << (piles[i] - temp) << " " << (i + 1) << endl; 
                piles[i] = temp;
                for (int j = 0; j < k; ++j) {
                    if (j > 0) cout << " ";
                    cout << piles[j]; 
                }
                cout << endl;
                break;
            }
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值