存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
IT产业人才需求节节攀升。业内巨头百度、阿里巴巴、腾讯(简称BAT)在某海滩进行招聘活动。
招聘部门一字排开。由于是自由抢占席位,三大公司的席位随机交错在一起,形如:
ABABTATT,这使得应聘者十分别扭。
于是,管理部门要求招聘方进行必要的交换位置,使得每个集团的席位都挨在一起。即最后形如:
BBAAATTT 这样的形状,当然,也可能是:
AAABBTTT 等。
现在,假设每次只能交换2个席位,并且知道现在的席位分布,
你的任务是计算:要使每个集团的招聘席位都挨在一起需要至少进行多少次交换动作。
输入是一行n个字符(只含有字母B、A或T),表示现在的席位分布。
输出是一个整数,表示至少交换次数。
比如,输入:
TABTABBTTTT
程序应该输出:
3
再比如,输入:
TTAAABB
程序应该输出:
0
只有三个字母一共六种排列方式,所以枚举每一种排列方式的最小操作方案取最min
#include#include #include #include using namespace std; typedef long long LL; typedef pair pii; const int mod = 1e9 + 7 , INF = 0x3f3f3f3f , N = 1e6 + 10; int cnt[4]; // cnt[0] : A 的个数 cnt[1] : B 的个数 cnt[2] : T 的个数 int m[4][4]; // m[0][1] : 本应该是A 但却为B的个数 m[0][2] ... T的个数 // m[1][0] : 本应该是B 但却为A的个数 m[0][1] ... T的个数 // m[2][0] : 本应该是C 但却为A的个数 m[2][0] ... B的个数 int main() { string s; cin >> s; for (int i = 0 ; s[i] ; i ++) { if (s[i] == 'A') { s[i] = '0'; cnt[0] ++; } else if (s[i] == 'B') { s[i] = '1'; cnt[1] ++; } else { s[i] = '2'; cnt[2] ++; } } string ss = "012"; int res = INF; do{ int b[4] = {0}; memcpy(b,cnt,sizeof cnt); memset(m,0,sizeof m); int t = 0; int sum = 0; for (int i = 0 ; i < s.size() ; i ++) { if (s[i] != ss[t]) m[ss[t] - '0'][s[i] - '0'] ++; if (-- b[ss[t] - '0'] == 0) t ++; } int t1 = min(m[0][1],m[1][0]); m[0][1] -= t1; m[1][0] -= t1; sum += t1; t1 = INF; t1 = min(m[0][2],m[2][0]); m[0][2] -= t1; m[2][0] -= t1; sum += t1; t1 = INF; t1 = min(m[1][2],m[2][1]); m[1][2] -= t1; m[2][1] -= t1; sum += t1; int ans = 0; for (int i = 0 ; i < 3 ; i ++) for (int j = 0 ; j < 3 ; j ++) ans += m[i][j]; res = min(res,sum + ans / 3 * 2); }while(next_permutation(ss.begin(),ss.end())); cout << res; }



