题解:B4377 [蓝桥杯青少年组省赛 2025] 平衡奇偶位置的字符交换
BSHF_NOI_AU · · 题解
前言
本蒟蒻在考场上这道题思考了20分钟才做了出来。
正文
这道题并非模拟题,而是找规律,我们先观察样例,
输入
AABABA
输出
1
因为奇数位置上的 A 的数量需要等于偶数位置上的 A 的数量。所以就需要将 A 的数量统计出来,再平分给奇数和偶数,如果A的数量是奇数,就代表平分不了,按照题目要求输出
如果 A 的数量是偶数,就需要将 A 的总数平分,减去奇偶个数中较小的那个数,就是需要 A 和 B 交换的次数。即
如这个样例(自创):
输入
AABABABABA
输出
2
A的数量为
操作:
- 交换位置
2 和3 的字符(A 和 B) - 交换位置
4 和5 的字符(A 和 B)
此时奇数位上有
Code:
#include<bits/stdc++.h>
using namespace std;
int main(){
string a;
int sum = 0,cnt = 0;
cin>>a;
int len = a.length();
for(int i = 0;i<len;i++){//统计奇偶个数
if(a[i] == 'A'){
if((i+1)%2 == 1){//+1是因为位置编号从 1 开始
sum++;
}else if((i+1)%2 == 0){
cnt++;
}
}
}
if((sum+cnt)%2 == 1){//无法平分,输出-1
cout<<-1;
}else{
cout<<(sum+cnt)/2-min(sum,cnt);//先平分,再减去小的那个,就算是交换次数
}
return 0;
}