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

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

Leo2011 警示后人

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

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


先说结论:令奇数位的 A 有 个,偶数位的 A 有 个,那么如果 是奇数那么无解,否则答案是

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

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

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

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

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

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

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


ACCode with 注释
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#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] 平衡奇偶位置的字符交换
  • 作者: Leo2011
  • 创建于 : 2025-08-12 09:06:56
  • 更新于 : 2025-08-26 21:16:04
  • 链接: https://www.leo2011.eu.org/2025/08/12/ti-jie-b4377-lan-qiao-bei-qing-shao-nian-zu-sheng-sai-2025-ping-heng-qi-ou-wei-zhi-de-zi-fu-jiao-huan/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
Nickname
Email
Website
  • OωO
  • |´・ω・) ノ
  • ヾ (≧∇≦*) ゝ
  • (☆ω☆)
  • (╯‵□′)╯︵┴─┴
  •  ̄﹃ ̄
  • (/ω\)
  • ∠( ᐛ 」∠)_
  • (๑•̀ㅁ•́ฅ)
  • →_→
  • ୧(๑•̀⌄•́๑)૭
  • ٩(ˊᗜˋ*)و
  • (ノ °ο°) ノ
  • (´இ皿இ`)
  • ⌇●﹏●⌇
  • (ฅ´ω`ฅ)
  • (╯°A°)╯︵○○○
  • φ( ̄∇ ̄o)
  • ヾ (´・ ・`。) ノ "
  • (ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
  • (ó﹏ò。)
  • Σ(っ °Д °;) っ
  • (,,´・ω・)ノ"(´ っ ω・`。)
  • ╮(╯▽╰)╭
  • o(*////▽////*)q
  • >﹏<
  • ( ๑´•ω•) "(ㆆᴗㆆ)
  • 😂
  • 😀
  • 😅
  • 😊
  • 🙂
  • 🙃
  • 😌
  • 😍
  • 😘
  • 😜
  • 😝
  • 😏
  • 😒
  • 🙄
  • 😳
  • 😡
  • 😔
  • 😫
  • 😱
  • 😭
  • 💩
  • 👻
  • 🙌
  • 🖕
  • 👍
  • 👫
  • 👬
  • 👭
  • 🌚
  • 🌝
  • 🙈
  • 💊
  • 😶
  • 🙏
  • 🍦
  • 🍉
  • 😣
  • 颜文字
  • Emoji
  • Bilibili
0 comments
No comment