解题思路:

根据C++代码的思路写的Python代码。

3个字母有6种排列方式。对于任意一种方式进行求解,然后取出最小值。例如BAT,先得出要放B的位置上有多少个数非B,然后这些位置是和后面的AT交换的,A要先和在A区间上的B交换,没有了就放到T的区间上,然后再是A和T交换。

A的非a部分是一定会交换到B和C上的(即ab,at)。

在A区的b(ab)和B区的a(ba)交换时,A区的b的个数不一定够(ab<ba),只能将A 区的t交换到B区,而这一部分(ba-ab)最后还要与B区的t一起到t区(bt+ba-ab),此时总次数。

A区的b(ab)和B区的a(ba)交换时,A区的b的个数够用甚至有余(ab>=ba),A区的b除了交换到B区,还会交换到T区,这一部分b(ab-ba)最终会被换成t,交换数量上是bt的一部分,所以交换的次数是bt。

所以最后每次循环交换的次数c=ab+at+bt +ba-min(ba,ab)。


参考代码:


s=list(input())
le=len(s)
m=s[:]
sl=['ABT','ATB','BAT','BTA','TAB','TBA']
ans=[]
for i in range(6):
    c=0
    s=m
    a,b,t=sl[i][0],sl[i][1],sl[i][2]
    an,bn=s.count(a),s.count(b)
    ab,at=s[0:an].count(b),s[0:an].count(t)
    ba,bt=s[an:an+bn].count(a),s[an:an+bn].count(t)
    c=ab+at+bt+ba-min(ba,ab)
    ans.append(c)
print(min(ans))


点赞(0)
 

0.0分

0 人评分

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

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

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

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

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

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

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

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

评论列表 共有 0 条评论

暂无评论