原题链接:蓝桥杯2018年第九届真题-交换次数
解题思路:
根据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 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复