视频加载失败

题解:B4377 [蓝桥杯青少年组省赛 2025] 平衡奇偶位置的字符交换

题解:B4377 [蓝桥杯青少年组省赛 2025] 平衡奇偶位置的字符交换
464 字
2 分钟
题解:B4377 [蓝桥杯青少年组省赛 2025] 平衡奇偶位置的字符交换

考场做法逆天,结果发现是正解……

卡卡常(其实也没怎么卡)直接最优解榜一(查看时间:2025/08/12 09<08>)


先说结论:令奇数位的 A 有 XX 个,偶数位的 A 有 YY 个,那么如果 ∣X−Y∣\left| X - Y \right| 是奇数那么无解,否则答案是 ∣X−Y∣2\dfrac{\left| X - Y \right|}{2}。

为什么呢?其实证明也很简单。

首先我们发现题目只和字母 AA 相关,而且关键在于奇数位的 A 和偶数位的 A,于是我们分别对其计数。

然后我们考虑操作会产生什么影响。

每次可以选择交换两个位置相邻的字符。——题目

相邻的两个数显然是一奇一偶,而交换这两个只可能是奇数位换到偶数位(或偶数换到奇数位)。

这样就可以让奇数的数量减少一个,偶数增加一个(或者反过来)。

一个加一,另一个减一,它们的差当然是减少 22 了。而且每次操作都会减少 22,因为必然是奇换偶或偶换奇。因此得到了上面的结论,证毕。


带注释 AC Code:

#include <bits/stdc++.h>
using namespace std;
int a, b, n; // a 是偶数位,b 是奇数位,n 是字符串长度
string s;
int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin >> s;
n = s.size();
for (int i = 0;i < n;++i) if (s[i] == 'A') { // 注意到和 B 无关因此要判断
if (i % 2) ++b; // %2 余 0 就是 false,余 1 就是 true,正好分别对应偶数和奇数
else ++a;
}
if ((abs(b - a)) % 2) cout << -1 << endl; // 不知道谁大谁小,因此要取绝对值
else cout << ((abs(b - a)) >> 1) << endl; // 右移 1 位相当于除以 2,因为是非负数所以和 / 2 没有区别
return 0;
}

AC 记录~

理解万岁!

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
题解:B4377 [蓝桥杯青少年组省赛 2025] 平衡奇偶位置的字符交换
https://www.leo2011.eu.org/posts/luogu-b4377/
作者
Block_Fish
发布于
2025-08-12
许可协议
SATA

评论区

Profile Image of the Author
Block_Fish
大胆假设,小心求证。——胡适
公告
网站全面重构,有问题欢迎联系积木鱼!
分类
标签
最新动态
站点统计
文章
56
分类
7
标签
17
总字数
84,805
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
Netlify CI
博客版本
Firefly v6.16.8
文章许可
SATA

当前页面没有目录

文章目录

当前页面没有目录