#Palindrome Game (hard version)
链接: link.
题意:给定一个只包含01的字符串,翠花和狗剩先后进行操作,每次可以将一个0变成1 花费一元,或将字符串反转不花费钱第二个操作当且仅当字符串不是回文且上一次未反转时才成立,将0全部变成1后花费少的胜。
题解:
先考虑特例是回文
必败状态:回文有两个0且翠花先手 狗剩赢两块
有偶数个0 翠花先手狗剩每一次都点翠花点的按中点对称过来直到翠花进入必败状态 狗剩赢两块
有奇数个0 翠花可以先花意愿使变成第一种情况 翠花赢一块
特例 当是奇数且只有一个0 狗剩赢一块
再考虑普遍情况
对于一个字符串按一次只有两种情况是回文或不是回文,因为翠花先手所以当翠花先一步让狗剩进入会被迫近必败状态的情况 翠花必胜
特例只有两个零且不是回文只能一人花一块 平局
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <set>
#include <queue>
#include <vector>
#include <map>
#include <cmath>
#define x first
#define y second
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
typedef unsigned long long ULL;
const int N = 1e6 + 10, M = 1e6 + 10, INF = 0x3f3f3f3f, mod = 998244353;
int n, t;
int main() {
cin >> t;
while (t--) {
string str;
cin >> n >> str;
bool flag = true;
int cnt = 0;
for (int i = 0; i < str.size(); i++) {
if (str[i] == '0') cnt ++;
if (str[i] != str[n - i - 1]) flag = false;
}
if (flag) {
if (cnt & 1 && cnt != 1) cout << "ALICE" << endl;
else cout << "BOB" << endl;
}
else {
if (n & 1 && str[n / 2] == '0' && cnt == 2) cout << "DRAW" << endl;
else cout << "ALICE" << endl;
}
}
return 0;
}
本文探讨了一种基于01字符串的双人游戏,玩家翠花和狗剩轮流操作,目标是将所有0变为1。游戏策略围绕回文字符串展开,分析了不同情况下的胜败条件。对于回文字符串,特定条件决定了游戏结果;非回文字符串中,翠花有策略确保胜利。文章通过案例解析了游戏过程,并提供了C++代码实现。
545

被折叠的 条评论
为什么被折叠?



