本文共 1350 字,大约阅读时间需要 4 分钟。
为了解决这个问题,我们需要分析Nim博弈的规则,确定先手是否能获胜,并提供获胜策略。Nim博弈的关键在于异或和的计算,如果异或和为0,先手必输;否则先手必赢。
#include#include #include #include #include using namespace std;int main() { vector a; while (true) { string line; getline(cin, line); if (line.empty()) continue; istringstream iss(line); int m; iss >> m; if (m == 0) break; vector parts; for (int i = 0; i < m; ++i) { int num; iss >> num; parts.push_back(num); } vector heaps(parts.begin(), parts.end()); ll k = 0; for (int num : heaps) { k ^= num; } if (k == 0) { cout << "No" << endl; } else { vector take_list; for (int num : heaps) { int p = num ^ k; if (p < num) { take_list.push_back(num); take_list.push_back(p); } } cout << "Yes"; for (int num : take_list) { cout << ' ' << num; } cout << endl; } } return 0;}
istringstream读取每一行输入,处理每组的m和后续的m个石子数量。这种方法确保了我们能够高效地解决问题,并在O(m)时间复杂度内完成所有计算。
转载地址:http://kzlo.baihongyu.com/