解题思路:
因为只有只有3个字母(B,T,A),可以考虑暴力。
3个字母有6种排列方式。对于任意一种方式进行求解,然后取出最小值即可。
例如求解的顺序是BAT,我们要先得出要放B的位置上有多少个非B的数,然后这些位置肯定是和后面的AT交换的,但是和谁交换也是有要求的,A肯定要先和在A区间上的B交换,实在没有再放到T的区间上,然后再是A和T交换。总的来说,在B区间非B的数量与B区间交换完成后在A区间非A的数量和。
注意事项:
参考代码:
#include"iostream"
#include"cstdio"
using namespace std;
const int INF = 0x3f3f3f3f;
string s;
char t[][4]={"BAT", "BTA", "ABT", "ATB", "TBA", "TAB"};
int solve(char A, char B, char C){
int a=0, b=0, c=0;
for(int i=0;i<s.size();i++) {
if(s[i] == A)
a++;
else if(s[i] == B)
b++;
else
c++;
}
int cia=0,cib=0,cic=0,ci=0;
for(int i=0;i<a;i++){
if(s[i]!=A)
ci++;
if(s[i]==B)
cib++;
}
for(int i=a;i<b+a;i++){
if(s[i]==A)
cia++;
if(s[i]==C)
cic++;
}
ci+=cic+cia-min(cib,cia);
return ci;
}
int main(){
cin>>s;
int Min=INF;
for(int i=0;i<6;i++)
Min=min(Min,solve(t[i][0],t[i][1],t[i][2]));
cout<<Min;
return 0;
}
0.0分
3 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复