kqp发明了一个好玩的游戏,叫ljj一起玩。但ljj玩了十几盘,总是输,他想知道是不是从一开始他就注定要输。这个游戏是这样的,kqp先写下一排数,然后盖住。在选数时,kqp和ljj每次只能看到头与尾的数字并只能取其中一个数,同时还规定如果头和尾的数字一样,就选尾的。最后谁取的数的和多,谁就赢了。如果两人的和一样多,先取者胜。有天FW看到他们俩在玩这个游戏,很好奇。他想知道,在两人总是做出最优决策的情况下,谁能取得最终的胜利呢? 输入格式 第一行为一个数 k(k ≤ 10),表示有 k 组测试数据: 以下 k 组测试数据: 每组测试数据中,第一行仅有一个偶数 n(0 < n ≤ 100000),第二行也仅有一个数,0 表示kqp先取数,1 表示ljj先取数,第三行有 n 个数,是kqp给出的一排数。这 n 个数的绝对值均不超过106 。 输出格式 对每组测试数据输出一行表示在两人总是做出最优决策的情况下, 最终的胜利者的名字,即“kqp”或“ljj”(引号不输出)。如何用c++
时间: 2024-04-18 14:27:38 浏览: 105
你可以使用C++编程语言来解决这个问题。下面使用C++实现的代码示例:
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 计算Nimber值
int calculateNimber(int length) {
// 如果长度为偶数,Nimber值为0
if (length % 2 == 0) {
return 0;
}
// 如果长度为奇数,Nimber值为1
else {
return 1;
}
}
// 判断最终胜利者
string determineWinner(int n, int turn, vector<int>& nums) {
// 计算一排数的总长度
int length = nums.size();
// 用于存储每个子游戏的Nimber值
vector<int> nimbers(length, 0);
// 计算每个子游戏的Nimber值
for (int i = 0; i < length; i++) {
int j = i;
while (j < length && nums[i] == nums[j]) {
j++;
}
nimbers[i] = calculateNimber(j - i);
i = j - 1;
}
// 如果先取者的回合数为偶数,则先取者是kqp;否则,先取者是ljj
string firstPlayer = (turn % 2 == 0) ? "kqp" : "ljj";
// 计算最终胜利者
int nimSum = 0;
for (int nimber : nimbers) {
nimSum ^= nimber;
}
// 如果nimSum为0,则先取者胜利;否则,对手胜利
if (nimSum == 0) {
return firstPlayer;
} else {
return (firstPlayer == "kqp") ? "ljj" : "kqp";
}
}
int main() {
int k;
cin >> k;
for (int i = 0; i < k; i++) {
int n;
cin >> n;
int turn;
cin >> turn;
vector<int> nums(n);
for (int j = 0; j < n; j++) {
cin >> nums[j];
}
string winner = determineWinner(n, turn, nums);
cout << winner << endl;
}
return 0;
}
```
你可以将上述代码保存为一个以".cpp"为后缀的文件,然后使用C++编译器编译运行该文件。希望以上代码能够帮助到你!如果你还有其他问题,请随时提问。
阅读全文