解题思路:
因为只有只有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.0分

3 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论