优雅的伊利


私信TA

用户名:995745

访问量:5024

签 名:

等  级
排  名 1704
经  验 2601
参赛次数 6
文章发表 5
年  龄 0
在职情况 学生
学  校 烟台大学
专  业

  自我简介:

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

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区