本题思路大体上是用第一个字符串,去寻找倒序后存在相同字符的位置,该位置是交换的次数(不明白的话可以举例),之后对原字符串进行交换操作,需要注意的是,交换完成的字符可以弹出,因为我们是从第一个字符开始找的,弹出后不影响之后字符的交换次数

另外一个需要注意的点是,当我们遇到奇数字符时,交换次数为当前字符长度的一半(len//2),但是这里我们选择不进行交换,直到所有偶数字符完成交换完再进行该奇数字符的交换,这样才能符合贪心策略。

至于为什么要这样做,是因为如果你遇到奇数字符,当把该字符放到字符串中间的时候,很可能被下一个偶数字符又交换至旁边,使其不再中间位置,使得最后交换次数增加,贪心失败。因此,直接将奇数字符放到最后进行交换,更符合贪心策略。

代码如下

n = int(input())
s = list(input())
count = 0 # 总的交换次数
m = 0 # 奇数个字符的数量
while len(s) > 1:
    flag = 0
    x = s[0]    # 和待交换字符相同的字符
    sr = s[::-1]
    for i in range(len(s) - 1):
        if sr[i] == x:
            flag = 1
            count += i
            # 交换字符
            for j in range(len(s) - i - 1, len(s) - 1):
                s[j], s[j + 1] = s[j + 1], s[i]
            s.pop(0)
            s.pop(-1)
            break
    # 出现奇数字符
    if flag == 0:
        m += 1
        if m > 1:   # 出现多个奇数字符,直接结束
            break
        else:
            count += len(s) // 2
            #for k in range(0, len(s)//2):
            #    s[k], s[k + 1] = s[k + 1], s[k]
            s.pop(0)
if m > 1:
    print('Impossible')
else:
    print(count)


点赞(0)
 

0.0分

1 人评分

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

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

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

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

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

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

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

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

评论列表 共有 0 条评论

暂无评论