[CP / Codeforces] B1. Palindrome Game (easy version) (Div. 2) - 1200*

B1. Palindrome Game (easy version)

进度

  • 15:21.31 - WA on test 2
  • 19:47.61 - WA on test 2
  • 28:40.87 - WA on test 2
  • 31:48.09 - WA on test 2
  • 33:42.69 - EDITORIAL

分析

一直都不太会做 games 类的题目,这次也不出所料地失败了,不过相信会越做越熟练。

因为题目给出了 "both players play optimally" 的前提(如果不给也没法做),按照博弈树的思想,每位玩家所做出的决策都会使自己尽可能地接近胜利,同时使对方尽可能地接近失败。

显然,根据题目要求,如果玩家当前不得不执行 operation 1,那么他们一定会尽可能地使操作后的字符串变为回文串,以迫使对方玩家也执行 operation 1,如此一来双方花费的 cost 都会加一。那么,如何使 cost 产生差异,即,如何使对方花费比自己更多的 cost 呢?使用 operation 2。如果对方非常不幸地在执行 operation 1 后得到了一个非回文串,那么我方可以使用免费的 operation 2,使得对方在下一步操作时依然只能做 operation 1,从而花费更多的 cost。

上面这些分析与题解无异,但还不足以解出此题。之所以这样说,是因为它们只是做到了局部性最优,却无法保证最终的结果最优。这就是为什么我得到了 4 个 WA。

考虑如下情况:

0000

我的想法是:

ABBA

这么做是平局。然而,最优的操作事实上能产生如下结果:

AAAB

但是,究竟要如何想出这样的操作,同时不掉入前面的思维陷阱,目前来看,我感觉没有什么具体的方法,只能靠猜——无非是我猜的情况不够多,没有找到更优的情况而已。

代码

void solve() {
int n = 0;
std::cin >> n;
std::string s;
std::cin >> s;
int cnt = 0;
for (auto c : s) {
if (c == '0') {
++cnt;
}
}
if (cnt % 2 == 0 || cnt == 1) {
std::cout << "BOB\n";
} else {
std::cout << "ALICE\n";
}
}
posted @   ZXPrism  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示