测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A40805. 交换次数

填空题 困难

题目描述

交换次数

题目描述

IT产业人才需求节节攀升。业内巨头百度、阿里巴巴、腾讯(简称BAT)在某海滩进行招聘活动。

招聘部门一字排开。由于是自由抢占席位,三大公司的席位随机交错在一起,形如:

ABABTATT,这使得应聘者十分别扭。

于是,管理部门要求招聘方进行必要的交换位置,使得每个集团的席位都挨在一起。即最后形如:

BBAAATTT 这样的形状,当然,也可能是:

AAABBTTT 等。

现在,假设每次只能交换2个席位,并且知道现在的席位分布,

你的任务是计算:要使每个集团的招聘席位都挨在一起需要至少进行多少次交换动作。

输入是一行n个字符(只含有字母B、A或T),表示现在的席位分布。

输出是一个整数,表示至少交换次数。

比如,输入:

TABTABBTTTT

程序应该输出:

3

再比如,输入:

TTAAABB

程序应该输出:

0

我们约定,输入字符串的长度n 不大于10万

资源约定:

峰值内存消耗(含虚拟机) < 256M

CPU消耗 < 1000ms

参考答案

const int INF = 0x3f3f3f3f; string s; char t[][4] = {"BAT", "BTA", "ABT", "ATB", "TBA", "TAB"}; int f(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; } void solve() { cin >> s; int Min = INF; for (int i = 0; i < 6; ++i) Min = min(Min, f(t[i][0], t[i][1], t[i][2])); cout << Min; }
上一题 下一题