zuoyouzuo


私信TA

用户名:liuruilin

访问量:996

签 名:

等  级
排  名 20607
经  验 691
参赛次数 0
文章发表 4
年  龄 0
在职情况 学生
学  校 南昌大学
专  业

  自我简介:

TA的其他文章

解题思路:

根据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分

2 人评分

  评论区

  • «
  • »