解题思路:
因为只有只有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分
5 人评分
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:505 |
C语言程序设计教程(第三版)课后习题6.4 (C语言代码)浏览:539 |
C语言程序设计教程(第三版)课后习题8.1 (C语言代码)浏览:725 |
C二级辅导-进制转换 (C语言代码)浏览:515 |
剔除相关数 (C语言代码)浏览:1019 |
C语言训练-自由落体问题 (C语言代码)浏览:1743 |
C语言程序设计教程(第三版)课后习题7.3 (C语言代码)浏览:1196 |
WU-输出九九乘法表 (C++代码)浏览:1674 |
1908题解浏览:640 |
C语言程序设计教程(第三版)课后习题7.4 (C语言代码)浏览:512 |